0

明らかなことかもしれませんが、このスニペットの出力を合理化することはできません。参考:これ

public class Sample {

    public static void main(String[] args) {
        Set<Integer> set = new TreeSet<Integer>();
        List<Integer> list = new ArrayList<Integer>();

        for (int i = -3; i < 3; i++) {
            set.add(i);
            list.add(i);
        }
        System.out.println("After adding elements:");
        System.out.println(set + " " + list);

        for (int i = 0; i < 3; i++) {
            set.remove(i);
            list.remove(i);
        }
        System.out.println("After removing elements:");
        System.out.println(set + " " + list);
    }
}

出力:

要素を追加した後:

[-3、-2、-1、0、1、2] [-3、-2、-1、0、1、2]

要素を削除した後:

[-3、-2、-1] [-2、0、2]

私は期待している:

要素を削除した後:

[-3、-2、-1] [0、1、2]

つまり、list.remove(i) は実際にはリストの 1 番目、2 番目、3 番目の項目を削除する必要があります。けっこうだ ?

4

5 に答える 5

6

最初の要素を削除すると、リスト内の要素の位置が変更されるため、コードの動作は理にかなっています。

例えば

for (int i = -3; i < 3; i++) {
    set.add(i);
    list.add(i);
}
System.out.println("After adding elements:");
System.out.println(set + " " + list);

for (int i = 0; i < 3; i++) {
    set.remove(i);
    list.remove(i);
}

list.remove(i) を呼び出すたびに、リストは 1 項目ずつ小さくなり、項目の位置は左に移動します: 位置 1 にあった項目は位置 0 に移動し、位置 2 にあった項目は位置 1 に移動します。等...

要素または List の clear メソッドを削除するには、Iterator を使用します。

値に基づいて Integer オブジェクトを削除する場合は、int を Integer に変更します。

list.remove(Integer.valueOf(i));
于 2013-05-19T13:19:39.010 に答える
3

いいえ、次の行:

 set.remove(i);

渡した int 型とボックスを Integer オブジェクトに取り (こちらを参照)、次に Integer equals() メソッドを使用して、削除する必要がある要素を決定します。これは、 Set ofremove(int index)にそのようなメソッドがないために発生しますが、プリミティブ型を「何らかの形で」オブジェクトに変換する必要があることを意味するだけremove(Object o)です。Java では、プリミティブ型ごとにラッパー型があり、「変換」はオートボクシングと呼ばれます。ボックス化解除と呼ばれる「現象」もあることに注意してください:)。

于 2013-05-19T13:21:43.987 に答える
1
[-3, -2, -1, 0, 1, 2]
remove index 0
[-2, -1, 0, 1, 2]
remove index 1
[-2, 0, 1, 2]
remove index 2
[-2, 0, 2]

リスト内のあなたの位置は、削除するたびに変化しています。位置「0」を3回削除するだけです。

于 2013-05-19T13:22:32.823 に答える
1

削除するオブジェクトをSet指定しているため、実際には値が削除され、セットから削除されます。したがって、結果として残りの要素を取得します。 012

削除するオブジェクトのインデックスを指定Listしているため、実際にはインデックスの値をリストから削除します。したがって、結果として残りの要素を取得します。次のように機能します。 012

Initially (i=0): [-3, -2, -1, 0, 1, 2]
                   ^
                   X 
Step 1 (i=1): [-2, -1, 0, 1, 2]
                    ^
                    X
Step 2 (i=2): [-2, 0, 1, 2]
                      ^
                      X
Result:       [-2, 0, 2]
于 2013-05-19T13:23:22.110 に答える
0

関数型プログラミングの方法でそれを行うことを想像したことがありますか?

//マッチャーとラムダジの両方に静的インポートを追加して、以下のコードをシミュレートしていることを確認してください

import static ch.lambdaj.Lambda.*;
import static org.test.matcher.MatcherFactory.*;   //this can be anything

    List<Integer> original = Arrays.asList(1,2,3,4,5,6);

    List<Integer> oddList = filter(odd, original);

   for(int s : oddList){
    System.out.println(s);
    }
   //and it prints out   1,3,5

そして、MatcherFactory.java というクラスを作成します。

public class MatcherFactory {

    public static Matcher<Integer> odd = new Predicate<Integer>() {
        public boolean apply(Integer item) {
                return item % 2 == 1;
            }
    };

   //put as many as matchers you want and reuse them
}

ここからlambdajライブラリをダウンロードできます

https://code.google.com/p/lambdaj/wiki/LambdajFeatures

他の例を見る

于 2013-05-19T13:46:00.563 に答える