[英]Iterating over HashSet with for each
我正在尝试遍历HashSet
的Integer对象,我想计算元素发生的次数。 到目前为止,这是我的方法
public int freq(int element) {
int numElements = 0;
for (int atPos : mySet){
if (mySet.atPos == element){ //says atPos cannot be resolved to a field
numElements++;
}
}
return numElements;
}
使用迭代器遍历元素会更好吗? 我该如何解决
mySet.atPos
线?
这是我初始化HashSet
private HashSet <Integer> mySet = new HashSet<Integer>();
集合不能包含重复的元素。 因此,您的element
总是得到0或1的计数。
对于任何集合,您可以通过以下方式获取元素的频率:
public int freq(int element) {
return Collections.frequency(mySet, element);
}
不知道您想用它做一个方法...
您的问题是对如何使用变量的简单误解。 int atPos
和mySet.atPos
不是指同一件事。 前者指的是局部变量,后者指的是被称为同一事物的集合实例的字段的公共成员。
您正在尝试访问此字段:
public class HashSet
{
public int atPos; //<<<
}
但是,当我们以这种方式考虑时,显然该字段在HashSet
中不存在!
您需要做的就是摆脱mySet.
这样您的代码就会起作用。
if (atPos == element){
numElements++;
}
使用迭代器遍历元素会更好吗?
不,在这种情况下使用迭代器没有任何好处。 每个的A更具可读性。
正如其他人指出的那样,由于集合永远不会包含重复项,因此您的numElements
实际上只会是1或0。 这样,您实际上可以非常紧凑地编写函数,如下所示:
public int freq(int element) {
if (myset.contains(element)) {
return 1;
}
else {
return 0;
}
}
甚至使用三元运算符更好:
public int freq(int element) {
return myset.contains(element) ? 1 : 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.