2015-08-20 2 views
2

Я программирую список, содержащий списки строк.Java Список списков

Вот как это выглядит:

List<List<String>> WPL = new ArrayList<List<String>>(); 
List<String> WP = new ArrayList<String>(); 

WP.add("A"); 
WP.add("B"); 
WPL.add(WP); 

WP.clear(); 

WP.add("C"); 
WP.add("D"); 
WPL.add(WP); 

for(List<String> a : WPL) { 
    System.out.println(a.indexOf(a)); 
    for (String i : a) 
    { 
     System.out.println(i); 
    } 

} 

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

-1 
C 
D 
-1 
C 
D 

Что мне нужно

0 
A 
B 
1 
C 
D 

Что я делаю неправильно?

+0

'a.indexOf (а)' ', как может Ā' содержать себя (в вашем случае)? – MadProgrammer

+0

Что это за 'aktuell'? И вы имеете в виду 'a.indexOf (« A »)'? – Babel

+0

Правильно, должен быть WPL.indexOf (a) – DroidDroid

ответ

2

Когда вы составляете список списков, он не копирует значения - он копирует ссылку в список источников. Итак, когда вы

WP.add("A"); 
    WP.add("B"); 
    WPL.add(WP);  

    WP.clear(); //this also clears the values in WPL since WPL doesn't store A and B, it stores a reference to WP. 

    WP.add("C"); 
    WP.add("D"); 
    WPL.add(WP); 

Чтобы решить эту проблему, я рекомендую создать новый список для каждого элемента, который необходимо добавить в него. Но также будьте осторожны, чтобы любые изменения исходных исходных списков также отражались в WPL. Вы также можете просто установить WP в новый экземпляр ArrayList (если вам нужно ссылаться на старый ArrayList, вы можете получить к нему доступ через WPL, так как WPL фактически сохраняет ссылку на него, а не напрямую).

List<List<String>> WPL = new ArrayList<List<String>>(); 
    List<String> WP = new ArrayList<String>(); 

    WP.add("A"); 
    WP.add("B"); 
    WPL.add(WP); 

    WP = new ArrayList<String>(); 

    WP.add("C"); 
    WP.add("D"); 
    WPL.add(WP); 

    for(List<String> a : WPL) { 
     System.out.println(a.indexOf(a)); 

     for (String i : a) 
     { 
      System.out.println(i); 
     } 

    } 

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

https://www.youtube.com/watch?v=eRfvgSvf-mM

+0

Вот и все! Большое спасибо! – DroidDroid

2
WPL.add(WP) 

Это добавляет ссылку на список WP. Он не делает копию WP. Поэтому, когда вы очищаете WP, вы очищаете содержимое списка внутри WPL.

+0

Я боялся, что это причина. Итак, как я могу повторно использовать WP? – DroidDroid

+0

@DroidDroid У вас нет. Вы создаете новый. – Andreas

+1

Сделайте копию (или другой список) для замены WP. – Deximus

0

Java работает на ссылочное

WP.clear(); 

очищает список, где уже был добавлен 'A' и 'B'. Что вам нужно сделать, вместо этого

List<String> WP = new ArrayList<String>(); 

    WP.add("A"); 
    WP.add("B"); 
    WPL.add(WP); 

List<String> WP2 = new ArrayList<String>(); 

    WP2.add("C"); 
    WP2.add("D"); 
    WPL.add(WP2); 
+0

На самом деле вам не нужно определять новую переменную (WP2), вы можете использовать одну и ту же переменную (WP) с новым списком. – Andreas

+0

Yup, работает так же :) –

+0

Справа, работает. Благодарю вас. – DroidDroid

0

Просто для Пинки, вот очень короткая версия, которая также фиксирует ваш цикл печати.

List<List<String>> WPL = Arrays.asList(Arrays.asList("A", "B"), 
             Arrays.asList("C", "D")); 
for (int i = 0; i < WPL.size(); i++) { 
    System.out.println(i); 
    for (String s : WPL.get(i)) 
     System.out.println(s); 
} 

Выход:

0 
A 
B 
1 
C 
D 
Смежные вопросы