Как использовать цикл for для этой проблемы в Java

public class Lab2 {
    public static Cities [] PathSolution = new Cities[7];
    int PathIndex = 0;
    int StartCity;

    static Cities [] City = new Cities [4];
    public static void main(String[] args){
        for(int i = 0; i<City.length; i++)
            City[i] = new Cities();
        City[0].Initialization ( 0, 1, 1);
        City[1].Initialization ( 1, 5, 5);
        City[2].Initialization ( 2, 10, 3);
        City[3].Initialization ( 3, 2, 7);

Я хотел бы использовать цикл for в этой задаче, чтобы он проходил через все города. Например:

    City[0].Distance(5, 5);
    City[0].Distance(10, 3);
    City[0].Distance(2, 7);
    City[1].Distance(1, 1);
    City[1].Distance(10, 3);
    City[1].Distance(2, 7);
    City[2].Distance(1, 1);
    City[2].Distance(5, 5);
    City[2].Distance(2, 7);
    City[3].Distance(1, 1);
    City[3].Distance(5, 5);
    City[3].Distance(10, 3);

В настоящее время я вручную набираю приведенный выше код, чтобы пройти через все города, используя созданный мной метод «Расстояние». Итак, сейчас мне нужно вручную написать City[0] - City[1], City[0] - City[2].. City[1] - City[0], City[1] - City[2] и т. д. .

Итак, в основном я хочу, чтобы каждый город проходил через каждый город (кроме себя), используя метод Distance. Объяснение кода: Инициализация в этом формате (cityID, cityX, cityY) (X и y - координаты) Формула расстояния работает следующим образом: Город[a].Расстояние(x,y) Координаты x и y - это координаты городов 0,1,2 и 3, и в настоящее время я ввожу их вручную. Я хотел бы иметь цикл for, который бы проходил по всем городам (кроме себя).

Я пробовал это для цикла, но это не сработало:

for (int i = 0; i < City.length; i++) {
            City[i].Distance(5, 5);
            i++;
            City[i].Distance(10,3);
            i++;
            City[i].Distance(2,7);
            i++;
        }

Это дистанционный метод:

public void Distance(float x, float y) {
        int dist = (int) sqrt(Math.pow(City_X_Location - x , 2) + Math.pow(City_Y_Location - y , 2));
        System.out.println(dist);
    }

Вот что я получаю, когда использую метод расстояния:

City[0].Distance(5, 5);

3

Это результат, который я получаю, когда набираю его вручную, и то, что я должен получить из цикла for:

3
8
0
6
8
0
6
3
0
6
3
8

Не делайте i++; внутри цикла for. Вы использовали цикл for и уже определили i++ как операцию приращения, которая выполняется после каждой итерации, поэтому нет необходимости выполнять ее еще 3 раза за цикл.

OH GOD SPIDERS 18.11.2022 11:32

Пожалуйста, следуйте соглашениям об именах Java: начальная строчная буква для имен переменных и методов (city, pathIndex, startCity, initialization(), distance()).

jsheeran 18.11.2022 11:34

Если я правильно понимаю вашу логику, вы пытаетесь рассчитать расстояние от каждого города до любого другого города. Лучше всего это сделать с помощью вложенного цикла. Есть ли у вашего класса городов методы для получения его координат X и Y? Возможно ли что-то вроде City[0].getXLocation()?

OH GOD SPIDERS 18.11.2022 11:52

Да, на самом деле это так.. Но инициализация всегда заключается в том, чтобы последний город получил значения x и y. Например, если я пишу City[1].Get_X(), он по-прежнему показывает значение x City[3], потому что я инициализировал его последним..

NewCoder2001 18.11.2022 12:08

«Например, если я пишу City[1].Get_X(), он по-прежнему показывает значение x City[3], потому что я инициализировал его последним.» <- @NewCoder2001 Похоже, вы объявили эти поля как static, когда они должны не быть.

OH GOD SPIDERS 18.11.2022 13:45
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас есть случай, когда вы хотите «сравнить» элемент массива друг с другом. Я полагаю, что вы не возражаете против небольших проблем с оптимизацией, поэтому я упрощаю:

//Step 1 : iterate over all your cities.
for(Cities current : City) {
    //Step 2 : compare current city with eachother
    for(Cities other : City) {
        //Step 3 : make sure that you don't compare a city with itself
        if (!current.equals(other)) {
            //Step 4 : use the distance method using the other's coordinates :)
            current.Distance(other.City_X_Location, other.City_Y_Location);
        }
    }
}

Таким образом, каждый элемент (первый цикл) будет сравниваться друг с другом (второй цикл). Утверждение «if» просто сделано, чтобы убедиться, что вы не сравниваете дважды один и тот же элемент.

Я использую city.City_X_Location и city.City_Y_Location прямо так, как вы показываете это в методе Distance, думая, что это будет атрибут public, но было бы лучше, если бы вы могли сделать его приватным и создать метод getCity_X_Location().

Наконец, если вы не привыкли использовать синтаксис for(Item i : Iterrable), не стесняйтесь превращать их в for(int i = 0; i < City.length(); i++)

Другие вопросы по теме