我为project Euler problem 10编写了这段代码。但在第24行它有一个错误。如何解决?
public static void main(String[] args) {
int i;
int b = 2000;
List<Integer> notPrime = new ArrayList<Integer>();
notPrime.add(2);
notPrime.add(3);
notPrime.add(5);
notPrime.add(7);
for (i = 2; i < b; i++) {
if (i % 2 != 0 && i % 3 != 0 && i % 5 != 0 && i % 7 != 0) {
notPrime.add(i);
}
}
for(int primesNum:notPrime){
int dd = (int) Math.pow(primesNum, 2);
int indexofdd = Arrays.asList(notPrime).indexOf(dd);
//here is the error
notPrime.remove(indexofdd);
}
int summy = notPrime.stream().mapToInt(Integer::intValue).sum();
System.out.println(summy);
}
答案 0 :(得分:1)
Arrays.asList(notPrime)
的类型为List<List<Integer>>
,意味着Arrays.asList(notPrime).indexOf(<some int>)
始终为-1(未找到),因为List<List<Integer>>
不能包含{{1} }}
因此,对Integer
的调用将失败,因为Javadoc状态:
抛出IndexOutOfBoundsException - 如果索引超出范围
List.remove
。
您可以简单地写一下:
(index < 0 || index >= size())
(无需单独notPrime.remove(Integer.valueOf(dd));
来电)
您需要indexOf
以确保调用Integer.valueOf
,而不是List.remove(Object)
:后者删除给定索引处的元素,而前者删除列表元素给定的值。
然而,这段代码的逻辑看起来更普遍。