2017-01-09 57 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