У меня проблема с программой, которую я делаю, и я, честно говоря, не могу найти решение.Кажется, что объекты, содержащиеся в коллекции Java ArrayList, изменяются без моего программирования таких модификаций.
Программа в целом предназначена для создания случайного соединения между двумя узлами в сетке 10x10 путем перемещения по пути.Этот путь представлен в виде набора точек ArrayList в сетке, причем первый индекс содержит местоположение первого узла (узел A), а последний индекс содержит местоположение второго узла (узел B).Я делаю это, находя себя в местоположении А, а затем перемещаясь случайным образом к смежным точкам в сетке, повторяя это во время цикла пока не будет достигнуто местоположение Б.
Кажется, все работает, за исключением того, что «путь»«Коллекция каким-то образом изменяется, так что каждая точка в ней оказывается такой же, как последняя точка, в которую я перемещаюсь, что также является местоположением Б.
Метод следующий:
public void generateRandomPath()
{
path = new ArrayList<Point>();
path.add(pInitial);
complete = false;
while(!complete)
{
k = path.get(path.size()-1);
d = selectDirection(k);
GUI.log.append("==== Before the method. ==== \n");
GUI.log.append(Integer.toString(path.get(path.size()-1).getX())+" - "+Integer.toString(path.get(path.size()-1).getY())+"\n");
x = move(k, d);
path.add(x);
if(k.getX() == pEnd.getX() && k.getY() == pEnd.getY())
complete = true;
}
GUI.log.append("Finished. \n");
}
- " Точка " - это просто точки, координаты X и Y которых представлены целыми числами.
- " pInitial " - точка, представляющая местоположение узла A.
- " pEnd " - точка, представляющая местоположение узла B.
- " d " - это направление, в котором я собираюсь двигаться в этом повторении.Это может быть вверх, вправо, вниз или влево, представленные целыми числами 1, 2, 3 и 4. соответственно.
- " k " - последняя точка на пути, котораяэто точка, в которую он переместился в предыдущем повторении.
- " x " - это новая точка, в которую он переместился в текущем повторении.
Итакчто он в основном делает, так это захватывает последнюю точку пути в качестве ориентира, выбирает направление и затем перемещается в точку, смежную в этом направлении.Каждое повторение цикла while должно добавлять новую точку к path .Однако в конечном итоге происходит не только добавление этой новой точки, но и каждая точка , уже находящаяся в path , принимает значение этой последней добавленной точки.Используя записи журнала, показанные выше (GUI.log.append), мне удалось увидеть, что путь таинственным образом изменяется внутри шага:
x = move(k, d);
Это следующий метод:
private Point move(Point n, int y)
{
GUI.log.append("==== Inside the method. ==== \n");
GUI.log.append(Integer.toString(path.get(path.size()-1).getX())+" - "+Integer.toString(path.get(path.size()-1).getY())+"\n");
Point newP = n;
if(y == 1)
newP.setY(n.getY()-1);
if(y == 2)
newP.setX(n.getX()+1);
if(y == 3)
newP.setY(n.getY()+1);
if(y == 4)
newP.setX(n.getX()-1);
GUI.log.append("==== After method. ==== \n");
GUI.log.append(Integer.toString(path.get(path.size()-1).getX())+" - "+Integer.toString(path.get(path.size()-1).getY())+"\n");
return newP;
}
Целое число y - это направление, указанное выше.Как видите, этот метод никоим образом не изменяет path , но в журналах это показано.В этом примере узел A находился в точке X = 2, Y = 3. Журнал показывает, каковы координаты последней точки в пути .Как видите, координаты последней точки в пути принимают значение координат новой точки , но этой новой точки еще не былодобавлено в путь .
Честно говоря, я не знаю, как это происходит.Если бы кто-нибудь мог придумать причину, я был бы очень признателен, если бы вы мне сказали.