2013-07-01 53 views
-1

我正在實現一個代碼來返回數組中的第n個最大數字, 以下是我實現的代碼;在Java中使用迭代器

public int getNthLargestNum(int [] givenArr, int n){ 

    int nTotal=0; 
    int nNthNum = -1; 

    // Remove Duplicates 
    Set<Integer> o_hs = new TreeSet<Integer>(); 
    for(int insert=0; insert<givenArr.length; insert++) 
    {o_hs.add(givenArr[insert]);} 

    Iterator it = o_hs.iterator(); 
    int count=0; 

    while(it.hasNext()){ 
     if(count == n){ 

     // IF I MOVE THE LINE HERE 
     // nNthNum = (Integer)it.next(); 

      break; 
     } 
     nNthNum = (Integer)it.next(); 
     count++; 
    } 

return nNthNum;  
} 

如果我輸入數組givenArr [4,14,4,5,6,8,9]和n = 2的輸出是5上面的程序,但如果我移動線nNthNum =(整數)it.next();在if循環內輸出4.

所以我很想知道要循環遍歷循環,我們應該始終實現it.next()?

回答

1

A HashSet本質上是無序的,所以從集合中獲取第N項是沒有意義的。你不知道你得到什麼價值。該算法本質上是任意的。相反,迭代排序的數組以獲得第N個最大值,或者使用而不是無序的TreeSet

由於您實際上並不需要排序集中的全部數據,因此您可以隨時從該集中刪除項目。從技術上講,如果你做了每個操作都是O(1),那麼集合中最多隻有5個項目,從而使得整個算法O(n)。

public int getNthLargestNum(int[] data, int n){ 
    TreeSet<Integer> set = new TreeSet<Integer>(); 
    foreach(int number : data) 
    { 
     set.add(number); 
     if(set.size() > 5) 
      set.pollFirst(); 
    } 

    return set.first(); 
} 
+0

我打算用Set來重複複製。但是如果數據很大,TreeSet將會受到一次perfomrance的攻擊嗎?有沒有其他方法可以刪除重複項。我知道我可以使用HashMaps並將計數存儲爲值,除HashMap以外是否還有其他選擇? – JNL

+0

'TreeSet'不會比你從'Arrays.sort'獲得的任何更高的性能。 –

+0

@JNL對你的數據調用'Sort'已經對使用'SortedSet'有相同的性能影響。將n項添加到'SortedSet'爲O(n * log(n)),排序n項爲O(n * log(n))。通過將這些項目添加到'SortedSet'中,您不需要*執行數組排序。此外,請專注於首先獲取工作數據,然後根據需要進行優化。使用算法在產生錯誤結果時速度更快是沒有意義的。 – Servy

0

是的,如果你不這樣做it.next(),集合中的下一個元素將不會被提取。

it.hasNext()調用不會提前指向集合中下一個元素的指針。