Содержимое в ArrayList изменяется - PullRequest
0 голосов
/ 19 апреля 2011

У меня проблема с программой, которую я делаю, и я, честно говоря, не могу найти решение.Кажется, что объекты, содержащиеся в коллекции 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. Журнал показывает, каковы координаты последней точки в пути .Как видите, координаты последней точки в пути принимают значение координат новой точки , но этой новой точки еще не былодобавлено в путь .

Example of the alteration of path.

Честно говоря, я не знаю, как это происходит.Если бы кто-нибудь мог придумать причину, я был бы очень признателен, если бы вы мне сказали.

1 Ответ

8 голосов
/ 19 апреля 2011

Попробуйте

Point newP = new Point(n.getX(), n.getY());

вместо

 Point newP = n;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...