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]
有些数字会触发这种情况发生,有些则没有。所以我再次感谢任何反馈。
答案 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);
}