Справка по Java ArrayList - PullRequest
       5

Справка по Java ArrayList

2 голосов
/ 11 ноября 2010

Допустим, у меня есть ArrayList of Strings, называемый list1, содержащий строки: «A», «B», «C», «D», «E».Затем у меня есть другой ArrayList типа storageUnit, который является классом, который я написал, называется list2.Пожалуйста, смотрите код ниже для лучшего объяснения:

ArrayList<String> list1 = new ArrayList<String>();
ArrayList<storageUnit> list2 = new ArrayList<storageUnit>();

storageUnit newUnit = new storageUnit();
for (int i = 0; i < list1.size(); i++) {
    newUnit.category = list1.get(i);
    list2.add(newUnit);      
}

static class storageUnit {
    String category;
    Hashtable<String, Integer> wordTable = new Hashtable<String, Integer>();
};

Теперь, если я попытаюсь напечатать все категории всех единиц хранения в списке 2, я получу [E, E, E, E, E] вместо [A, B, C, D, E].Кто-нибудь может объяснить, почему это происходит?

Ответы [ 6 ]

6 голосов
/ 11 ноября 2010

Измените

storageUnit newUnit = new storageUnit();
for (int i = 0; i < list1.size(); i++) {
    newUnit.category = list1.get(i);
    list2.add(newUnit);      
}

на

for (int i = 0; i < list1.size(); i++) {
    storageUnit newUnit = new storageUnit();
    newUnit.category = list1.get(i);
    list2.add(newUnit);      
}

Ваш код создавал один объект (newUnit) и добавлял его в список несколько раз.Каждый раз вы перезаписываете его категорию, поэтому при печати списка вы получаете одно и то же значение несколько раз.

Вместо этого вам нужно каждый раз создавать новый newUnit объект.

2 голосов
/ 11 ноября 2010

Когда вы добавляете newUnit к list2, вы добавляете один и тот же экземпляр storageUnit 5 раз. Это означает, что если вы измените один, вы измените все остальное. Вам нужно объявлять новую единицу хранения каждый раз, когда вы добавляете в list2.

ArrayList<String> list1 = new ArrayList<String>();
ArrayList<storageUnit> list2 = new ArrayList<storageUnit>();


for (int i = 0; i < list1.size(); i++) {
    storageUnit newUnit = new storageUnit();    
    newUnit.category = list1.get(i);
    list2.add(newUnit);      
}

static class storageUnit {
    String category;
    Hashtable<String, Integer> wordTable = new Hashtable<String, Integer>();
};
1 голос
/ 11 ноября 2010
ArrayList<String> list1 = new ArrayList<String>();
ArrayList<storageUnit> list2 = new ArrayList<storageUnit>();


for (int i = 0; i < list1.size(); i++) {
    storageUnit newUnit = new storageUnit();
    newUnit.category = list1.get(i);
    list2.add(newUnit);      
}

static class storageUnit {
    String category;
    Hashtable<String, Integer> wordTable = new Hashtable<String, Integer>();
};

Пара вещей.Вы получали первый элемент ArrayList list1 в каждой итерации цикла.Кроме того, у вас были проблемы со ссылками на объект newUnit, созданный вне цикла.Вы создали его один раз и вставили в ArrayList несколько раз.ArrayList указывал на этот ОДИН объект несколько раз.Последняя итерация циклов устанавливает единицу для значения «E», поэтому все записи в ArrayList (list2) были направлены на одну и ту же единицу со значением «E».

1 голос
/ 11 ноября 2010

1) Начинайте названия классов с заглавной буквы. Должно быть StorageUnit, а не storageUnit.

2) Вы делаете свой новый блок вне цикла. Затем добавьте один и тот же блок в список 5 раз. Вместо этого попробуйте:

for (int i = 0; i < list1.size(); i++) {
    storageUnit newUnit = new storageUnit();
    newUnit.category = list1.get(0);
    list2.add(newUnit);      
}
1 голос
/ 11 ноября 2010

Я думаю, это должно быть list1.get(i), а также вы должны создать новый блок внутри цикла

0 голосов
/ 16 мая 2013

Попробуйте это ..

Во время итерации цикла, тот же объект (newUnit.category) инициализируется для категории для получения значения.Таким образом, каждая итерация переопределяет значения категорий. В случае использования приведенной ниже кодировки.

storageUnit newUnit = new storageUnit ();

for (int i = 0; i < list1.size(); i++) {
    newUnit.category = list1.get(i);
    list2.add(newUnit);      
}

поместите storageUnit newUnit = new storageUnit (); с в цикл for, чтобы он мог создавать новый объект для каждой итерации, и значения не переопределяли.

 for (int i = 0; i < list1.size(); i++) {
        storageUnit newUnit = new storageUnit();
        newUnit.category = list1.get(i);
        list2.add(newUnit);      
    }

надеюсь, это поможет вам ..

...