Неправильное сохранение / распределение / установка переменных - PullRequest
0 голосов
/ 11 июня 2018

У меня есть проблема с моим кодом, и я не нахожу ошибки, должно быть что-то тривиальное.

// This list is filled with Objects of Matcher
ArrayList<Matcher > fullListForBundle = new ArrayList<>();

// making a new ArrayList
ArrayList<Matcher> bundlelist = new ArrayList<>();

// making a new object
Matcher currentBundle = new Matcher();

// Searching trough an Arraylist of Objects.
for (Matcher current : stockDataCompleteWithBundle)
{
    // Get an Identifier
    String han = current.getThirdColumn();
    // Search through an other list to match identifier
    for (int i = 0; i < fullListForBundle.size(); i++)
    {
        // If identifier matches then do:
        if (fullListForBundle.get(i).getFifteenthColumn().equals(han))
        {
            // I want to get the right object and save it in currentBundle
            currentBundle = fullListForBundle.get(i);

            // !!! Here begins my problem !!!

            // Then I want to change two Strings in that particular Object
            currentBundle.setFirstColumn(current.getFirstColumn());
            currentBundle.setThirteenthColumn(current.getSecondColumn());

            // And add that object to a new Arraylist
            bundlelist.add(currentBundle);
            }

        }
    }

Моя проблема: При установке firstColumn и thirteenColumn данные в fullListBundle.get(i) Объект изменен, а не объект currentBundle.Чего мне не хватает?

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Когда вы это делаете,

currentBundle = fullListForBundle.get(i);

И currentBundle, и fullListForBundle.get(i) ссылаются на один и тот же объект в куче.Вы должны увидеть одинаковые результаты с обоими.Если вы просто хотите, чтобы currentBundle попытался внести изменения,

 currentBundle = fullListForBundle.get(i).clone();

EDIT: Object.clone() метод имеет доступ protected, что означает, что он видим для подклассов и классов в одном пакете.

Хорошо иметь конструктор копирования для ручного копирования объекта.

/**
    Deep copy all the information from other to this
*/
public Matcher(Matcher other) {
   this.id = other.id;
}

Чтение Why a copy constructor by Josh Bloch ?

0 голосов
/ 11 июня 2018

Это потому, что вы используете один и тот же объект.вам нужно получить клонированный объект и внести изменения.

currentBundle = fullListForBundle.get(i).clone()
...