2017-01-09 6 views
-2

Попытка сортировать список по убыванию, так долгое время. Это мой метод. Я использовал несколько страниц здесь, чтобы сделать его правильным, однако что-то в моем коде неверно и возвращает список, который не так корректен.сортировка хэш-карты на основе interger

public static ArrayList<String> winnerIs(List<HP> hp){ 
     //System.out.println("1"); 
     int size = hp.size(); 
     //System.out.println(size); 
     ArrayList<HP> listofWinner = new ArrayList<HP>(); 
     Map<String, Integer> map = new HashMap<String, Integer>(); 

     for(int i = 0; i < size; i++){ 
      listofWinner.add(hp.get(i)); 
      map.put(hp.get(i).getName(), hp.get(i).TD1()); 
      //System.out.println(hp.get(i).getName()+" "+hp.get(i).TD1()); 
     } 
     //sort based on time 
     ArrayList<String> keys = new ArrayList<String>(map.keySet()); 
     //System.out.println("---------------"); 
     /*for(int i = 0; i < keys.size(); i++){ 
      //wn.add(keys.get(i)); 
      System.out.println("here "+keys.get(i)); 
     }*/ 
     //System.out.println("---------------"); 


     ArrayList<String> wn = new ArrayList<String>(); 

     //System.out.println("---------------"); 
     for(int i = keys.size()-1; i >= 0; i--){  
      wn.add(keys.get(i)); 

     } 
     return wn; 
    } 

вот что reurns:

[team2, team1, team4, team3] 

, но это должно быть так:

[team4, team3, team2, team1] 

это не имеет значения, если время равно, нам просто нужно лучше время, я не уверен, какая часть кода неверна.

даже когда я использую этот

ArrayList<Integer> s = new ArrayList<Integer>(map.values()); 
     Collections.sort(keys); 
     //System.out.println("---------------"); 
     for(int i = 0; i < s.size(); i++){ 
      //wn.add(keys.get(i)); 
      System.out.println("here "+s.get(i)); 
     } 

результат все еще не исправить здесь то, что она возвращает:

here 2 
here 9 
here 0 
here 0 

поэтому я использовал один из страниц в stackoverflouw, и я нашел это решение:

public static ArrayList<String> winnerIs(List<HumanPlayer> hp){ 
     //System.out.println("1"); 
     int size = hp.size(); 
     //System.out.println(size); 
     ArrayList<HumanPlayer> listofWinner = new ArrayList<HumanPlayer>(); 
     Map<String, Integer> map = new HashMap<String, Integer>(); 

     for(int i = 0; i < size; i++){ 
      listofWinner.add(hp.get(i)); 
      map.put(hp.get(i).getName(), hp.get(i).getTimeDriver1()); 
      //System.out.println(hp.get(i).getName()+" "+hp.get(i).getTimeDriver1()); 
     } 
     map.entrySet().stream() 
     .sorted(Map.Entry.<String, Integer>comparingByValue().reversed()) 
     .limit(1000) 
     .forEach(System.out::println); 

     return null; 
    } 

это возвращает правильный список, но я не уверен, что это: .limit(1000), а также как я могу сопоставить это со списком, чтобы я мог его вернуть.

+1

Вы на самом деле выполняете переупорядочение, а не сортировку. 'HashMap' - неупорядоченная карта. Вместо этого используйте 'LinkedHashMap' или отсортируйте список результатов с помощью' Collections.sort'. –

+0

Вы помещаете имя в качестве ключа и сортируете полученный набор ключей(). Я не знаю, что такое TD1(), но если это время, которое вы хотите отсортировать, тогда вы должны сортировать значения на своей карте, а не в ключах. – Amit

+0

@Amit, как я могу это сделать, это должно быть valueSet() вместо keySet() ?? –

ответ

0

Вы можете использовать Java 8 для хорошей сортировки по значению карты:

Map<String, Integer> sorted = /* your map */.entrySet().stream() 
     .sorted(Entry.comparingByValue()) //comparator for value, can reverse or use other 
     .collect(Collectors.toMap(Entry::getKey, Entry::getValue, 
       (e1, e2) -> { throw new IllegalArgumentException("Duplicate Key: " + e1.getKey()); }, 
       LinkedHashMap::new)); 

Я решил бросить исключение для дубликата ключа (функции слияния , то третий аргумент Collectors#toMap), но вы также можете просто вернуть первый ключ найден:

.collect(Collectors.toMap(Entry::getKey, Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new)); 

что нужно иметь в виду контракты, что отдельные карты отстаивания. HashMap - это несортированная карта и не будет гарантировать порядок итерации (так что сортировка была бы бесплодной попыткой), а TreeMap - это SortedMap, но это означает, что оно сортируется по ключу, а не по значению. A LinkedHashMap сохранит порядок итераций, как правило, на основе вставки (примерно как List), и, как правило, это то, что вы хотите, когда вам нужно иметь сортированный вывод карты.

0

Предполагая, что метод TD1() в вашем классе HP - это значение, которое вы хотите сортировать, и что вы действительно хотите использовать карту, чтобы помочь вам сортировать. Я думаю, что вы хотите что-то вроде этого

Map<Integer, List<String>> map = new HashMap<Integer, List<String>>(); 
for (HP h : hp) { 
    if (map.get(h.TD1() != null) { 
     map.get(h.TD1()).add(h.getName()); 
    } 
    else { 
     List temp = new ArrayList<String>(); 
     temp.add(h.getName()); 
     map.put(h.TD1(), temp); 
    } 
} 
ArrayList keys = Arrays.asList(map.getKeyset().toArray()); 
Collections.sort(keys); 

for (int i = keys.length() - 1; i >= 0; i--) { 
    List<String> names = map.get(i); 
    // print names 
} 
+0

Нет, это нехорошо, потому что метод getName не является списком здесь, используя h.getName(), он говорит, что метод get также должен изменить BTW. Я получаю так много ошибок при произнесении типов, используя ваше решение. –

0

Проверьте этот psuedo-код, я думаю, вы получите общую идею, глядя на это.

Map<Integer,List<String> map = new HashMap<Integer,List<String>>(); 
for(HP hpObject:hp) { 
if(map.containsKey(hpObject.TD1())) { 
    map.get(hpObject.TD1()).add(hpObject.getName()); 
} else { 
    List<String> names = new ArrayList<String>(); 
    names.add(hpObject.getName()); 
    map.put(hpObject.TD1(),names); 
} 
} 

    // To sort by keys 
    TreeMap sortedByTD = new TreeMap(map); 

    // Iterate over TreeMap and create the list of winners you need 
    return result;enter code here 
+0

TreeMap - это SortedMap, который сжимается для сортировки по ключу (не значение). Было бы лучше использовать «LinkedHashMap», но я не вижу, чтобы вы вообще сортировали в своем ответе. – Rogue

+0

Как вы упомянули, TreeMap сортируется, поэтому, когда мы создаем TreeMap из HashMap, как указано выше, он, естественно, сортирует его с помощью ключей Integer (которые являются Timings). Все, что вам нужно сделать, это перебрать и создать окончательный список имен для возврата. – Amit

+0

Да, но op не использует целые ключи, он использует целочисленные значения. – Rogue