Напишите функцию. Функция должна принимать массив городов (название и координаты)

Напишите функцию. Функция должна принимать массив городов (название и координаты). И должна возвращать объект содержащий два города, которые находятся друг от друга на наименьшем расстоянии.

Вот мой код:

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;  
→ Ссылка