2017-04-18 58 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); 
} 

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