projectEuler 10 中的这段代码有什么问题?
what is wrong with this code in projectEuler 10?
我为 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);
}
Arrays.asList(notPrime)
的类型是 List<List<Integer>>
,这意味着 Arrays.asList(notPrime).indexOf(<some int>)
将始终为 -1(未找到),因为 List<List<Integer>>
不能包含 Integer
.
因此对 List.remove
的调用将失败,因为正如 Javadoc 所述:
Throws IndexOutOfBoundsException - if the index is out of range (index < 0 || index >= size())
.
你可以简单地写:
notPrime.remove(Integer.valueOf(dd));
(无需单独 indexOf
调用)
您需要 Integer.valueOf
以确保调用 List.remove(Object)
,而不是 List.remove(int)
:后者删除给定索引处的元素,而前者删除列表具有给定值的元素。
但是,这段代码的逻辑看起来更普遍。
我为 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);
}
Arrays.asList(notPrime)
的类型是 List<List<Integer>>
,这意味着 Arrays.asList(notPrime).indexOf(<some int>)
将始终为 -1(未找到),因为 List<List<Integer>>
不能包含 Integer
.
因此对 List.remove
的调用将失败,因为正如 Javadoc 所述:
Throws IndexOutOfBoundsException - if the index is out of range
(index < 0 || index >= size())
.
你可以简单地写:
notPrime.remove(Integer.valueOf(dd));
(无需单独 indexOf
调用)
您需要 Integer.valueOf
以确保调用 List.remove(Object)
,而不是 List.remove(int)
:后者删除给定索引处的元素,而前者删除列表具有给定值的元素。
但是,这段代码的逻辑看起来更普遍。