Коллекции Java и псевдонимы - PullRequest
0 голосов
/ 28 марта 2011

Как вы справляетесь с алиасами в Java? Простое решение - сделать копию, скажем, ArrayList, но когда я пытаюсь написать код, мои данные перезаписываются новыми данными. Подробно:

ArrayList<ArrayList> temp = new ArrayList<ArrayList>() ;
ArrayList<ArrayList> personRecord = new ArrayList<ArrayList>() ;
ArrayList<String> personDetail = new ArrayList<String>() ;

...

while (input.hasNextLine())
    {
        String line = input.nextLine() ;

        String [] tokens = line.split(" ", 0) ;


        for (String s: tokens )
        {       
            personDetail.add(s) ;
        }

        temp.add(personDetail) ;

        personRecord.addAll(temp) ;

        temp.clear() ;
        personDetail.clear() ;
    }

выход:

[[Peter, M, 1972], [Peter, M, 1972]]

вместо:

[[Peter, M, 1972], [Anne, F, 1974]]

Ответы [ 2 ]

1 голос
/ 28 марта 2011

Вы должны переместить создание personDetail внутри цикла, чтобы получить новый Arraylist для каждого человека:

ArrayList<ArrayList> personRecord = new ArrayList<ArrayList<String>>() ;

while (input.hasNextLine())
    {
        ArrayList<String> = new ArrayList<String>();
        String line = input.nextLine() ;

        String [] tokens = line.split(" ", 0) ;


        for (String s: tokens )
        {       
            personDetail.add(s) ;
        }
        personRecord.add(personDetail);
     }

temp не требуется ни в коем случае.

1 голос
/ 28 марта 2011

Похоже, вы привыкли к коллекциям C ++!Ссылки на объекты в Java являются указателями (несмотря на синтаксис ссылок), а коллекции являются коллекциями указателей.Коллекции никогда не копируют объекты при их добавлении.Если вы хотите создать список списков, выделите список списков вне цикла, а внутри цикла выделите один список в верхней части цикла.Заполните его в теле цикла и добавьте в список списков внизу цикла.Вот и все.Временные работы не требуются.

...