0

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]]
4

2 に答える 2

1

C++ コレクションに慣れているようです。Java のオブジェクト参照は (参照構文にもかかわらず) ポインターであり、コレクションはポインターのコレクションです。コレクションは、追加時にオブジェクトをコピーすることはありません。リストのリストを作成する場合は、リストのリストをループの外側に割り当て、ループの内側にループの先頭に単一のリストを割り当てます。ループ本体でそれを埋め、ループの一番下にある list-of-lists に追加します。それでおしまい。一時的なものは必要ありません。

于 2011-03-27T21:43:54.910 に答える
1

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いずれの場合も必要ありません。

于 2011-03-27T21:52:10.660 に答える