我正在开发一个程序,用于计算整数Collection中的正值,并且有问题。我对Java有点陌生,想知道是否有人可以指出我出了问题的地方。
public class CountPositives {
/**
* Returns the number of positive values in the given Collection.
*/
public static int countPositives(Collection<Integer> collection) {
List<Integer> copy = new ArrayList(collection);
int positive = 0;
Iterator<Integer> itr = copy.iterator();
for (int i = 0; i < copy.size(); i++) {
if (copy.get(i) > 0 ) {
positive ++;
}
}
return positive;
}
}
答案 0 :(得分:1)
您的代码对我来说很好。 (尽管您有从未使用过的Iterator
)。.
也许更简单的方法是:
return (int) copy.stream().filter(e -> e > 0).count();
将过滤掉所有非正数,然后返回它们的计数。您也可以简单地使用传递的Collection
:
public static int countPositive(Collection<Integer> collection) {
return (int)collection.stream().filter(e -> e > 0).count();
}
这将消除副本List
和多余的变量。
请注意,count()
返回一个long
。如果collection
的大小可能超过int
的限制,则需要将返回类型更改为long
而不是强制转换为int
。
答案 1 :(得分:0)
您没有使用Iterator
。 Collection
s can automatically give you an iterator,因此无需将其转换为ArrayList
即可。
Iterator<Integer> itr = collection.iterator();
现在您实际上必须使用。 for
语句对于初学者来说可能看起来很奇怪,但请记住,for
语句以可选的初始化步骤开始,可以省略。
for(; itr.hasNext();) {
Integer value = itr.next();
// rest of your logic here
}
如果愿意,可以直接在for
语句中初始化迭代器。
for(Iterator<Integer> itr = collection.iterator(); itr.hasNext();) {
Integer value = itr.next();
// rest of your logic here
}
尽管复制很浪费,但是代码似乎还不错。该代码的关键部分是检查是否存在正值,而您的代码确实完成了该操作。这只是使其变得更加干净和礼貌。