【发布时间】:2023-04-07 01:57:01
【问题描述】:
尝试按降序对列表进行排序,因此最长的时间在前。这是我的方法,我从这里使用了几页来使其正确,但是我的代码中的某些内容是错误的,它返回的列表不太正确。
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;
}
这是它的重复:
[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) 以及如何将其等同于列表,以便我可以返回它。
【问题讨论】:
-
您实际上是在重新排序,而不是排序。
HashMap是一个无序映射。请改用LinkedHashMap,或使用Collections.sort对结果列表进行排序。 -
您将 name 作为键并对稍后获得的 keyset() 进行排序。我不知道 TD1() 是什么,但如果是你想要排序的时间,那么你应该在 Map 中排序值而不是键。
-
@Amit 如果是 valueSet() 而不是 keySet(),我该怎么做??
-
如果你在你的 HP 类中实现 Comparable,那么你可以只对输入 List 进行排序然后颠倒顺序,不需要 Map
-
这个很不清楚,你能清理一下你的代码,还有标题,wn是一个列表而不是地图