为每个迭代HashSet

时间:2017-04-18 15:14:05

标签: java iterator hashset

我正在尝试迭代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>();

2 个答案:

答案 0 :(得分:2)

Set不能包含重复元素。因此,您shiptime = driver.find_element_by_id("app_ctl00_ctl01_lblServiceDays")的计数总是为0或1。

对于任何集合,您可以通过以下方式获取元素的频率:

element

不确定你是不是想用它来制作方法......

答案 1 :(得分:1)

您的问题是对如何使用变量的简单误解。 int atPosmySet.atPos不指同一件事。前者指的是局部变量,后者正在寻找一个集合实例的字段的公共成员,称为同一个东西。

您正尝试访问此字段:

public class HashSet
{
    public int atPos; //<<<
}

但是,当我们这样想的时候,显然HashSet中不存在该字段!

您需要做的就是摆脱mySet.,您的代码将会正常运作。

if (atPos == element){
    numElements++; 
}
  

使用迭代器迭代元素会不会更好?

不,在这种情况下使用迭代器没有任何好处。每个A都更具可读性。

正如其他人所说,因为集合永远不会包含重复项,所以numElements实际上只会是一个或零。因此,您实际上可以非常紧凑地编写函数:

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;
}