繁体   English   中英

遍历HashSet与每个

[英]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 atPosmySet.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM