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
Пожалуйста, следуйте соглашениям об именах Java: начальная строчная буква для имен переменных и методов (city
, pathIndex
, startCity
, initialization()
, distance()
).
Если я правильно понимаю вашу логику, вы пытаетесь рассчитать расстояние от каждого города до любого другого города. Лучше всего это сделать с помощью вложенного цикла. Есть ли у вашего класса городов методы для получения его координат X и Y? Возможно ли что-то вроде City[0].getXLocation()
?
Да, на самом деле это так.. Но инициализация всегда заключается в том, чтобы последний город получил значения x и y. Например, если я пишу City[1].Get_X(), он по-прежнему показывает значение x City[3], потому что я инициализировал его последним..
«Например, если я пишу City[1].Get_X(), он по-прежнему показывает значение x City[3], потому что я инициализировал его последним.» <- @NewCoder2001 Похоже, вы объявили эти поля как static
, когда они должны не быть.
У вас есть случай, когда вы хотите «сравнить» элемент массива друг с другом. Я полагаю, что вы не возражаете против небольших проблем с оптимизацией, поэтому я упрощаю:
//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++)
Не делайте
i++;
внутри цикла for. Вы использовали цикл for и уже определилиi++
как операцию приращения, которая выполняется после каждой итерации, поэтому нет необходимости выполнять ее еще 3 раза за цикл.