2

プログラムを実行すると、10 個の乱数が出力され、各数値がLinkedListリストに格納されます。このリストが表示され、元の配列の 10 個ではなく、4 ~ 5 個の数値のみが表示されます。簡単なコードは次のとおりです。

import java.util.LinkedList;
import java.util.Random;

public class randomSum {
    private static Random rand = new Random();
    private static LinkedList<Integer> arr = new LinkedList<Integer>();

    public static void main(String[] args) {
        int num = 0;

        System.out.println("Original List");
        for(int i=0; i < 10; i++) {
            num = rand.nextInt(1000);
            arr.add(num);
            System.out.println(num);
        }

        System.out.println("\nLinkedList List");
        for(int j=0; j < arr.size(); j++)
            System.out.println(arr.remove(j));
    }
}

出力はそのようなものですが、これは私が期待したものとはまったく異なります。どちらも同じである必要があります。なぜそれが起こっているのですか?

Original List
693
239
33
999
862
965
994
884
127
977

LinkedList List
693
33
862
994
127
4

4 に答える 4

4

各反復で、印刷している要素を削除しているためです。それはインデックスを分割します。たとえば、要素 at を削除するindex 0と、要素 at index 1now は に移動しindex 0ますが、ループ インデックスはindex 1now に移動します。そのため、に移動したばかりの要素index 0は処理されませんでした。これはすべての代替要素で発生するため、その出力が得られます。

get(j)代わりに使用する必要がありますremove(j)

for(int j=0; j < arr.size(); j++)
    System.out.println(arr.get(j));

または強化された for ループを使用します。

for (int val: arr) {
    System.out.println(val);
}
于 2013-10-31T07:50:56.733 に答える
1

の印刷中に本当に項目を削除したい場合はLinkedListIterator. あなたがやっているように要素を削除すると、未定義の動作が発生します。そのようなことをしてください:

Iterator<Integer> it = arr.iterator();
while(it.hasNext()) {
    int element = it.next();
    System.out.println(element);
    it.remove();
}
于 2013-10-31T07:58:28.223 に答える
0

出力が来る規制がわかりますか?元のリストの 1 つおきの番号です。arr.remove(j) を使用するたびに、リスト arr のサイズが 1 縮小されます。そのため、ループは j==5 の間に終了し、その間 arr.size()=5 になります。さらに、arr.remove(j) を使用すると、jTH アイテムが削除され、j++ の後、元の (j+1) 番目の現在の jTH アイテムがスキップされます。したがって、他のすべての数値は元のリストから取得するという規則になります。

remove を get に置き換えると、期待どおりに機能します。また、remove(j) を remove(0) に置き換えて、ループ終了条件を j<10 に変更することもできます。これも正常に機能します。

于 2013-10-31T08:24:14.450 に答える
0

remove(j)この回答では、Rohit Jain が言ったように、実際に何が起こっているのかを説明したいと思います。

最初は、リストは次のようになります。

693 239 33 999 862 965 994 884 127 977

あなたがそれを呼び出す最初の反復の後、remove(0)このようになります

239 33 999 862 965 994 884 127 977

remove(1)そのため、次の反復を呼び出すと、33もともと 3 番目の要素だった要素が削除されます。したがって、元のリストに関して、実際には各反復で 2 つの要素を進めます。

于 2013-10-31T07:58:21.267 に答える