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) 实际上应该删除列表中的第一个、第二个和第三个项目。很公平 ?

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, ETC...

使用 Iterator 删除元素或 List 的 clear 方法。

如果要根据值删除 Integer 对象,请将 int 更改为 Integer:

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

不,以下行:

 set.remove(i);

将您传递的 int 类型和框放入 Integer 对象(请参见此处),然后它使用 Integer equals() 方法来确定必须删除哪个元素。发生这种情况是因为 Set of 中没有这样的方法remove(int index),但这仅remove(Object o)意味着必须将原始类型“以某种方式”转换为 Object,在 Java 中,每种原始类型都有一个 Wrapper 类型,并且“转换”称为自动装箱。请注意,还有一个叫做拆箱的“现象” :)。

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

您在列表中的位置会随着每次删除而改变。只需删除 3 倍的位置 '0'。

于 2013-05-19T13:22:32.823 回答
1

如果Set您指定要删除的对象,因此它实际上会删除 values 012从集合中删除。因此,您会得到剩余的元素。

List您指定要删除的对象的索引的情况下,它实际上会删除 indices 0和列表中的1值。2因此,您会得到剩余的元素。它的工作原理如下:

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

有没有想过以函数式编程的方式来做它?

//确保为 matcher 和 lambdaj 添加静态导入以模拟以下代码

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 回答