Напишите функцию. Функция должна принимать массив городов (название и координаты)
Напишите функцию. Функция должна принимать массив городов (название и координаты). И должна возвращать объект содержащий два города, которые находятся друг от друга на наименьшем расстоянии.
Вот мой код:
public static Result findClosestCities(City [] cities){
City cityFirst = new City(); // создаем новый объект для ПЕРВОГО города
City citySecond = new City(); // создаем новый объект для ВТОРОГО города
for (int i = 0; i < cities.length; i++){
for (int j = 0; j < cities.length; j++){
double d = 0;
double min;
d = (((cities[i].x - cities[j].x) * (cities[i].x - cities[j].x)) //расстояние между двумя точками
+ ((cities[i].y - cities[j].y) * (cities[i].y - cities[j].y)));
if (d < cityFirst.x && d < citySecond.x && d < cityFirst.y && d < citySecond.y){
cityFirst = cities[i];
citySecond = cities[j];
}
}
}
Result newObject = new Result(); // создаем новый объект для того чтобы передать полученные араметры
newObject.first = cityFirst; // полю first присваиваем все значения первого города
newObject.second = citySecond; // полю second присваиваем второй город
return newObject; // возвращаем новый объект
}
Мой Вопрос ? Неверный вывод - выводит все с нулевыми значениями. Хотя должны стоять цифры и название городов. Что не правильно в моей функции
Вот такой вывод на платформе:
result = {
"first" : {
"name" : null,
"x" : 0.0,
"y" : 0.0
},
"second" : {
"name" : null,
"x" : 0.0,
"y" : 0.0
}
};
Ответы (1 шт):
Автор решения: MBo
→ Ссылка
В if вы сравниваете несравнимое - координаты и расстояние (более того - квадрат расстояния). Вместо этого нужно поддерживать текущий минимум и обновлять его. Начальное значение - заведомо большое число или квадрат расстояния для одной из пар. Обратите внимание, что j всегда больше i
double d;
double dmin;
int imin = 0;
int jmin = 1;
dmin = (((cities[0].x - cities[1].x) * (cities[0].x - cities[1].x))
+ ((cities[0].y - cities[1].y) * (cities[0].y - cities[1].y)));
for (int i = 0; i < cities.length-1; i++){
for (int j = i + 1; j < cities.length; j++){
d = (((cities[i].x - cities[j].x) * (cities[i].x - cities[j].x))
+ ((cities[i].y - cities[j].y) * (cities[i].y - cities[j].y)));
if (d < dmin) {
dmin = d;
imin = i;
jmin = j;
}
}
}
Result newObject = new Result();
newObject.first = cities[imin];
newObject.second = cities[jmin];
return newObject;