2010-11-11 4 views
2

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

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>(); 
}; 

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

ответ

6

Изменить

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.

+0

Да, это имеет смысл. Спасибо! – TookTheRook

2

Когда вы добавляете 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>(); 
}; 
+0

Делает смысл. Благодаря! – TookTheRook

1

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

1

1) Запустите имя класса с заглавной буквы. Должно быть StorageUnit not storageUnit.

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

for (int i = 0; i < list1.size(); i++) { 
    storageUnit newUnit = new storageUnit(); 
    newUnit.category = list1.get(0); 
    list2.add(newUnit);  
} 
1
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>(); 
}; 

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

0

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

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

ХранениеUnit newUnit = новое хранениеUnit();

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

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

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

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

Смежные вопросы