遇到Eclipse中的'bug'或者我不理解的一些逻辑

时间:2017-10-18 12:07:16

标签: java arraylist

public SortedArrayList<T> incrementItems(int increment) {
for(T sh: this) {
    Integer newValue = (Integer) sh + (Integer) increment;
    this.set(this.indexOf(sh), (T) newValue);
    }
return this;
}

这是我的方法,它只是遍历列表中的每个元素并递增值,它在80%的时间内运行良好。但是,如果1是“元素”,则将其递增两倍(有时仅为有效)。

我在下面给出了一些例子:

    SortedArrayList<Integer> L1 = new SortedArrayList<Integer>();
    L1.addAll(Arrays.asList(1,3,6,1,6,6,7,8,11,11,14,15,20,20));
    System.out.println(L1.incrementItems(10));

输出是: [21, 13, 16, 21, 16, 16, 17, 18, 11, 11, 24, 25, 30, 30]

    SortedArrayList<Integer> L1 = new SortedArrayList<Integer>();
    L1.addAll(Arrays.asList(1,3,6,1,6,6,7,8,11,11,14,15,20,20));
    System.out.println(L1.incrementItems(9));

输出为:[10, 12, 24, 10, 15, 15, 16, 17, 29, 29, 23, 15, 20, 20]

    SortedArrayList<Integer> L1 = new SortedArrayList<Integer>();
    L1.addAll(Arrays.asList(1,3,6,1,6,6,7,8,11,11,14,15,20,20));
    System.out.println(L1.incrementItems(4));

输出为:[5, 19, 10, 5, 10, 10, 7, 12, 15, 11, 18, 15, 24, 24]

有些数字会触发这种情况发生,有些则没有。所以我再次感谢任何反馈。

1 个答案:

答案 0 :(得分:4)

这与Eclipse IDE无关。

您正在indexOf上调用List,这将检索第一个元素匹配。

每一次。

请参阅docs

  

返回此列表[...]

中指定元素第一次出现的索引

因此,如果您正在循环并且1遇到两次,indexOf将返回1的第一个位置,并且该元素将递增。

接下来发生的事情是基于List中的其他项目:如果在迭代后期找到增量项目的匹配项,则同一项目将再次增加,而后一项目将保持不变。

作为一个偏离主题的问题,您似乎在滥用泛型:您的SortedArrayList类接受任何类型的参数,但其incrementItems仅假定值为Integer

注意

如果您正在使用Java 8,则可以利用流的map功能轻松地将所有List元素投影到其递增值。

例如:

// this will generate a new `List` with incremented elements
List<Integer> incremented = originalList
    .stream()
    .map(x -> Integer.sum(x, increment))
    .collect(Collectors.toList());

如果您遇到Java 8之前的习语,可以使用以下代码创建新的List

List<Integer> incremented = new ArrayList<>();
for (Integer i: originalList) {
    incremented.add(i + increment);
}