2017-01-09 51 views
-2

嘗試按降序對列表進行排序,最長的時間在先。這是我的方法,我從這裏使用了幾頁來使其正確,但是我的代碼中的某些內容是錯誤的,並且返回了不正確的列表。基於整數的排序哈希映射

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()是什麼,但是如果是你想要排序的時間,那麼你應該在Map中排序值而不是鍵。 – 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是一個未分類的地圖,並不會保證迭代順序(因此排序將是徒勞無功的努力),TreeMapSortedMap,但合同意味着它按鍵排序,而不是價值排序。 A LinkedHashMap將保留迭代次序,通常基於插入(很像List),因此通常是您希望獲得有序映射輸出時所需的次數。

0

假設您的HP類中的TD1()方法是您想排序的值,並且您確實想使用Map來幫助您排序。我想你想是這樣的

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

不,這是不好的,因爲通過使用h.getName()方法getName不是一個列表它說get方法也應該改變BTW我得到這麼多類型鑄造錯誤使用你的解決方案。 –

0

檢查這僞代碼,我相信你會得到這個整體的想法。

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是按照上面的方式從HashMap創建TreeMap的時候進行排序的,它會自然地用Integer鍵(它們是Timings)對它進行排序。所有你需要做的就是迭代它並創建返回的最終名單。 – Amit

+0

是的,但操作不使用整數鍵,他使用整數值。 – Rogue