2017-04-18 146 views
0

我想迭代一个HashSet的Integer对象,我想要计算一个元素出现的次数。这是我的方法到目前为止迭代HashSet为每个

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 

line?

这是我初始化我HashSet

private HashSet <Integer> mySet = new HashSet<Integer>(); 
+0

嗯,你的'atPos'从组已收集到的整数。假设你的集合包含'3,2,111',那么你有三个循环,其中'atPos'是'3','2',最后是'111'。所以只要做'if(atPos == element)' – KarelG

+0

你的问题是对你如何使用变量的一个简单的误解。 'int atPos'和'mySet.atPos'不指向相同的东西。前者指的是一个局部变量,后者正在寻找一个名为同一事物*的实例的公共成员。 – Michael

+1

但...你是否意识到,你的'freq(...)'函数总是会得到0或1?这是如何工作... – KarelG

回答

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

一个Set不能包含重复的元素。因此,对于您的element,您总会得到0或1的计数。

对于任何集合,你可以得到与元件的频率:

public int freq(int element) { 
    return Collections.frequency(mySet, element); 
} 

不知道你想要做的方法了吧......