2013-07-01 2 views
-1

배열에서 n 번째 가장 큰 수를 반환하는 코드를 구현했습니다. 다음은 구현 한 코드입니다.Java에서 Iterator 작업

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

경우 I 입력 어레이 givenArr [4,14,4,5,6,8,9] 및 N = 2 출력은 상기 프로그램 5하지만 광고 nNthNum = 움직이면 (정수) it.next(); 내부에있는 if 루프는 4를 출력합니다.

그래서 루프를 반복하면서 it.next()를 구현해야하는지 궁금합니다.

답변

1

HashSet은 본질적으로 순서가 지정되지 않으므로 세트에서 N 번째 항목을 가져 오는 것은 의미가 없습니다. 당신은 어떤 가치가 있는지 전혀 모릅니다. 알고리즘은 본질적으로 임의적이다. 대신 정렬 된 배열을 반복하여 N 번째로 큰 값을 얻거나 TreeSet이 아닌이 정렬되어 있지 않습니다.

실제로 정렬 된 집합의 전체 데이터가 필요하지 않으므로 이동 중에 집합에서 항목을 제거 할 수 있습니다. 전문적으로, 당신은 각 연산이 O (1)이고, 전체 알고리즘 O (n)을 만드는 경우에만 집합은 최대 5 개의 항목을 갖기 때문에 기술적으로.

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

세트를 사용하여 복제본을 다시 사용할 계획이었습니다. 그러나 데이터가 거대한 경우 TreeSet에서 성능이 저하됩니다. 중복을 제거하는 다른 방법이 있습니까? 나는 HashMaps를 사용할 수 있고 값으로 카운트를 저장할 수 있다는 것을 알고있다. HashMap보다 다른 대안이 있는가? – JNL

+0

'TreeSet'는'Arrays.sort'에서 얻은 것보다 더 큰 성능을 발휘하지 않습니다. –

+0

@JNL 데이터에 'Sort'를 호출하면 이미 SortedSet 사용시와 동일한 성능 영향을 미칩니다. 'SortedSet'에 n 개의 항목을 추가하는 것은 O (n * log (n))이고, n 개의 항목을 정렬하는 것은 O (n * log (n))입니다. 아이템을'SortedSet'에 추가하면 배열 정렬을 수행 할 필요가 없습니다. 또한 작업 데이터를 먼저 얻은 다음 필요에 따라 최적화하십시오. 잘못된 결과를내는 알고리즘을 사용하는 것이 더 빠릅니다. – Servy

0

예, it.next()을 수행하지 않으면 수집의 다음 요소를 가져 오지 않습니다.

it.hasNext() 콜은 콜렉션의 다음 요소에 대한 포인터를 전진시키지 않습니다.