我正在努力在Java中创造一些高分。 基本上我想要一个hashmap来保存double值(所以索引从最高的double开始,所以我更容易对高分数排序)然后第二个值将是客户端对象,如下所示:
private HashMap<Double, TempClient> players = new HashMap<Double, TempClient>();
并插入一个新值:
TempClient client = new TempClient(kills, rank, deaths, name);
this.players.put(client.getKdr(), client);
现在,我当然无法遍历hashmap,因为它按键获取列表项,而不是索引。
如何迭代hashmap?对我的案子有什么好的想法吗?
我在Foo课程中尝试过:
输出:
0.5
0.6
0.9
0.1
2.5
代码:
public class Foo {
public static void main(String[] args) {
HashMap<Double, String> map = new LinkedHashMap<Double, String>();
map.put(0.5, "hey");
map.put(0.6, "hey1");
map.put(0.9, "hey2");
map.put(0.1, "hey425");
map.put(2.5, "hey36");
for (Double lol : map.keySet()) {
System.out.println(lol);
}
}
}
答案 0 :(得分:3)
你可以像这样迭代。
for (Double k : players.keySet())
{
TempClient p = players.get(k);
// do work with k and p
}
如果您想保持按键排序,请使用例如一个TreeMap。
如果您想按照插入的顺序保留按键
他们在那里,使用例如一个LinkedHashMap。
答案 1 :(得分:0)
最好的方法是使用EntrySet迭代遍历hashmap。
for (Map.Entry<Double, TempClient> entry : map.entrySet()) {
Double key= entry.getKey();
TempClient value= entry.getValue();
// ...
}
答案 2 :(得分:0)
最好让TempClient对象实现Comparable,将它们添加到列表中,然后只使用Collections.sort()。
答案 3 :(得分:0)
由于您无法对HashMap
中的项目进行排序,也无法按TreeMap
中的值对其进行排序,因此您可以将TreeSet
与自定义类一起使用:
class Score implements Comparable<Score>
{
final Player player;
final int score;
Score(Player player, int score) {
this.player = player;
this.score = score;
}
public int compareTo(Score other) {
return Integer.compare(this.score, other.score);
}
public int hashCode() { return player.hashCode(); }
public boolean equals(Object o) { return this.player.equals(...); }
}
TreeSet<Score> scores = new TreeSet<Score>();
score.add(new Score(player, 500));
for (Score s : scores) {
..
}
这将具有以下两个优点:
它应该可以轻松地与equals
,hashCode
和compareTo
之间的一致性工作,但也许你应该调整一些东西(因为它是未经测试的代码)。