2016-10-26 3 views
3

Я читал о картах в java. Я хочу просмотреть карту разных номеров и распечатать самые большие 3 числа на карте. Вот мой код:Как распечатать самые большие цифры на карте

public class Test { 

    private static int number=0; 

    public static void main(String[] args) { 

     Map<String,Integer> m = new HashMap<String,Integer>(); 

     m.put("haha", 1); 
     m.put("aa", 2); 
     m.put("rewq", 3); 
     m.put("la", 12); 
     m.put("oia", 10); 
     m.put("uyta", 4); 
     m.put("jpa", 5); 


     for (Entry<String, Integer> e : m.entrySet()) { 

      if (e.getValue() > number) { 
       number = e.getValue(); 
      } 

     } 
     m.values().remove(number); 
     System.out.println(number); 

     for (Entry<String, Integer> e : m.entrySet()) { 

      if (e.getValue() > number) { 
       number = e.getValue(); 
      } 

     } 
     m.values().remove(number); 
     System.out.println(number); 


     for (Entry<String, Integer> e : m.entrySet()) { 

      if (e.getValue() > number) { 
       number = e.getValue(); 
      } 

     } 
     m.values().remove(number); 
     System.out.println(number); 

    } 

} 

Выход

12 
12 
12 

Как я могу изменить код, чтобы сделать его печать, как это:

12 
10 
5 

Благодаря

+0

Java 8 только:... 'm.values ​​() потока() сортируется (Comparator.reverseOrder()) предел (3) .forEach (System.out :: println); ' –

+0

Вы бы облегчили себе жизнь, если бы вы использовали цикл for для поиска/удаления/печати 3 раза вместо того, чтобы дублировать код. –

+0

@DominikSandjaja Но это занимает память O (n) и O (n log n) для сортировки. top n должен принимать n (3 в этом случае) память и линейное время. –

ответ

5

Проблему с кодом является то, что вы перебор в три раза по сравнению с теми же номерами с тем же условием, не сбрасывая максимальное число найдено. Ваш код в основном находит наибольшее количество, а затем сравнивает каждый элемент на карте для больше номер два раза. Конечно, ничего не находит и печатает ранее найденное наибольшее число.

То, что вы скорее хочу:

  • получить все значения (не входные наборы)
  • сортировки значений
  • распечатать первые три

В Java это:

ArrayList<Integer> values = new ArrayList<Integer>(m.values()); 
Collections.sort(values); 
// turn ascending to descending 
Collections.reverse(values); 
System.out.println(String.format("%d, %d, %d", values.get(0), values.get(1), values.get(2))); 

Сортировка всех значений ev хотя вам нужны только первые три, это некоторые накладные расходы на расчет, но для списков из менее чем тысяч записей это пренебрежимо.

3

В настоящее время у вас есть единственная переменная для максимального значения, поэтому к концу вашей программы вы всегда будете иметь самую большую печать потому что вы все еще сравниваете его с наибольшим значением. Вот почему вы получаете одинаковое значение каждый раз. Вы можете прочитать все числа в arraylist, а затем вызвать метод collection.sort и взять верхнюю часть из этого и распечатать их.

С чем вы в настоящее время вы можете также сделать следующий

for(int i = 0; i < 3; i++) 
{ 
    //this makes sure you aren't comparing the same largest number everytime 
    number = Integer.MIN_VALUE; 
    for (Entry<String, Integer> e : m.entrySet()) { 
     if (e.getValue() > number) { 
      number = e.getValue(); 
     } 
    } 
    m.values().remove(number); 
    System.out.println(number); 
} 
+0

* «В настоящее время у вас есть единственная переменная для максимального значения, поэтому к концу вашей программы вы всегда будете иметь самую большую печатную информацию». * Похоже, вы пропустили, что OP пытается удалить ранее выбранное максимальное число, прежде чем найти следующий один.Поэтому вы должны также объяснить, если и почему это не работает. – Tom

3

Вы также можете использовать Java 8 возможностей добиться того, что вы хотите

 Map<String,Integer> m = new HashMap<String,Integer>(); 

     m.put("haha", 1); 
     m.put("aa", 2); 
     m.put("rewq", 3); 
     m.put("la", 12); 
     m.put("oia", 10); 
     m.put("uyta", 4); 
     m.put("jpa", 5); 


     m.values() 
      .stream() 
      .sorted(Comparator.reverseOrder()) 
      .limit(3) 
      .forEach(System.out::println);