2013-07-01 6 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] и п = 2 выход 5 для вышеуказанной программы, но если я переместить линию nNthNum = (целое число) it.next(); внутри цикла if, который он выдает 4.

Так что мне было любопытно узнать, чтобы итерация через цикл мы всегда должны реализовывать it.next()?

ответ

1

A HashSet по своей сути неупорядочен, поэтому получение N-го элемента из набора бессмысленно. Вы не представляете, какую ценность вы получите. Алгоритм по своей природе произволен. Вместо этого переберите отсортированный массив, чтобы получить N-е наибольшее значение, или используйте TreeSet, который не неупорядоченный.

Поскольку вам действительно не нужны все данные в отсортированном наборе, вы можете удалить элементы из набора по мере того, как вы идете. Технически, поскольку у набора только когда-либо максимум 5 элементов, если вы делаете это, каждая операция O (1), делая весь алгоритм 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 предпримет ударный удар, если данные будут огромными? Есть ли другой способ удаления дубликатов. Я понимаю, что могу использовать 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() звонок не будет продвигать указатель на следующий элемент в коллекции.

Смежные вопросы