【问题标题】:Unable to understand the behavior of following program ( Using java collection)无法理解以下程序的行为(使用 java 集合)
【发布时间】:2012-02-28 17:16:50
【问题描述】:

我有以下程序,我在其中添加几个数字来设置和列出然后删除它们,有人可以解释为什么 Set 和 list 有不同的行为。

public class SetList {
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);
    }
    for(int i=0;i<3;i++){
        set.remove(i);
        list.remove(i);
    }
    System.out.println(set+"            "+list);
}

}

输出是

[-3, -2, -1]            [-2, 0, 2]

我能够理解 Set 的行为,但无法理解 List 输出的行为。非常感谢所有帮助。

【问题讨论】:

    标签: java list collections set


    【解决方案1】:

    Set 和 List 是 collections 的不同类型。 Set 是一个关联集合,因此Set.remove(i) 将删除具有i 的元素。虽然 List 是一个索引集合,所以 List.remove(i) 删除列表中 ith 位置处的元素。

    因此,从包含 -3 ... 3 元素的 Set 中删除元素 0 到 3 后,您的 Set 将可以预见地包含值 -3 到 -1。

    使用列表,相同的删除顺序的结果可能会更令人惊讶,但它实际上是合乎逻辑的。您的列表最初包含:

    Index  0  1  2  3  4  5  6
    Value -3 -2 -1  0  1  2  3
    

    list.remove(0) 删除索引 0 处的元素,导致

    Index  0  1  2  3  4  5
    Value -2 -1  0  1  2  3
    

    请注意,(删除的)第一个元素之后的所有元素都向前移动了一个位置!因此,当list.remove(1) 删除索引 1 处的元素时,它会“跳过”元素 -2。结果是

    Index  0  1  2  3  4
    Value -2  0  1  2  3
    

    同样的下一个操作,list.remove(2)“跳过”元素0,导致

    Index  0  1  2  3
    Value -2  0  2  3
    

    最后,list.remove(3) 删除最后一个元素,给出最终结果:

    Index  0  1  2
    Value -2  0  2
    

    【讨论】:

    • +1 在集合旁边不允许添加重复的元素。
    • 谢谢彼得,请原谅我的无知,但我无法理解,对我来说(索引 0 处的元素是 -3,索引 1 包含 -2,索引 2 包含 -1)对不起,如果我在做有什么不对,但我真的很困惑。所以它应该打印 [0 1 2 ]
    • 太棒了...超级喜欢:) :) 非常感谢你救了我
    【解决方案2】:

    调用 Set.remove(int) 时,java 会将您的参数自动装箱为整数,但存在一个 List.remove(int),它通过索引删除值。

    【讨论】:

      猜你喜欢
      • 2017-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      • 2019-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多