对具有 class 作为值并在 Java 中具有多个变量(整数)的哈希表进行排序的最佳方法是什么?
What is the best method to sort a Hashtable who has a class as value with multiple variables (Integers) in Java?
我有一个系统可以检查按哈希表中的值排序,它用于获取该哈希表中排名靠前的字符串。我想在那个 Hashtable 中设置另一个值,所以我在里面使用 class,像这样:
Map<String, Values> hash = new Hashtable<String,Values>();
class:
public class Values {
public Integer a;
public Integer b;
public Values(Integer a, Integer b) {
this.a = a;
this.b = b;
}
}
我的 objective 正在对哈希表(整数 a 和 b)中的所有值进行排序,并返回显示谁具有最高值的哈希表字符串,(如数据库系统)是否可以这样做?我想这样做的原因是为了让游戏中的最佳杀手按整数 a 排序,并在整数 b 中设置最后一次杀戮的时间,所以如果玩家先于另一个杀戮并且杀戮数量相同它首先显示具有最高整数 b 的那个,这将是变量 b 中具有最高时间(毫秒)的那个。
做这样的事情最好的方法是什么?
编辑:编辑 post 改为对整个 entrySet()
进行排序。
要获得自定义排序顺序,您可以定义一个 Comparator>,指定您希望比较地图条目的顺序,如果排序应该反向进行(降序)。
根据您的描述,我认为您希望 a
成为第一个降序排序,然后 b
也被降序排序。
Comparator<Map.Entry<String, Values>> myValuesComparator = Comparator
.comparingInt((Map.Entry<String, Values> entry) -> entry.getValue().a)
.thenComparingInt(entry -> entry.getValue().b)
.reversed();
然后通过调用 .stream()
将 hash.entrySet()
变成一个流,然后通过调用 .sorted(myValuesComparator)
使用比较器对条目流进行排序。最后您将排序后的条目收集到一个新的集合中,我们将在此处将它们收集到一个List<Map.Entry<String, Values>>
中。
List<Map.Entry<String, Values>> list = hash.entrySet()
.stream()
.sorted(myValuesComparator)
.collect(Collectors.toList());
如果你想检查结果,你可以放置一个断点并检查列表中的元素或者只打印整个列表
for (Map.Entry<String, Values> entry : list) {
System.out.printf("Key: %s, score: %d, time of last update: %d%n", entry.getKey(), entry.getValue().a, entry.getValue().b);
}
如果您将 Hashtable
更改为 HashMap
,同样的代码也适用,正如 Mark Rotteveel 在评论中所建议的那样,因为 Hashtable
被认为是过时的 class.
这是我的示例输出
Key: Test9, score: 11, time of last update: 3
Key: Test8, score: 11, time of last update: 2
Key: Test7, score: 11, time of last update: 1
Key: Test6, score: 10, time of last update: 3
Key: Test5, score: 10, time of last update: 2
Key: Test4, score: 10, time of last update: 1
Key: Test3, score: 1, time of last update: 3
Key: Test2, score: 1, time of last update: 2
Key: Test1, score: 1, time of last update: 1
输入
hash.put("Test1", new Values( 1, 1));
hash.put("Test2", new Values( 1, 2));
hash.put("Test3", new Values( 1, 3));
hash.put("Test4", new Values(10, 1));
hash.put("Test5", new Values(10, 2));
hash.put("Test6", new Values(10, 3));
hash.put("Test7", new Values(11, 1));
hash.put("Test8", new Values(11, 2));
hash.put("Test9", new Values(11, 3));
设置键值=hash.keySet();
keys.stream().forEach(System.out::println);
我有一个系统可以检查按哈希表中的值排序,它用于获取该哈希表中排名靠前的字符串。我想在那个 Hashtable 中设置另一个值,所以我在里面使用 class,像这样:
Map<String, Values> hash = new Hashtable<String,Values>();
class:
public class Values {
public Integer a;
public Integer b;
public Values(Integer a, Integer b) {
this.a = a;
this.b = b;
}
}
我的 objective 正在对哈希表(整数 a 和 b)中的所有值进行排序,并返回显示谁具有最高值的哈希表字符串,(如数据库系统)是否可以这样做?我想这样做的原因是为了让游戏中的最佳杀手按整数 a 排序,并在整数 b 中设置最后一次杀戮的时间,所以如果玩家先于另一个杀戮并且杀戮数量相同它首先显示具有最高整数 b 的那个,这将是变量 b 中具有最高时间(毫秒)的那个。
做这样的事情最好的方法是什么?
编辑:编辑 post 改为对整个 entrySet()
进行排序。
要获得自定义排序顺序,您可以定义一个 Comparator
根据您的描述,我认为您希望 a
成为第一个降序排序,然后 b
也被降序排序。
Comparator<Map.Entry<String, Values>> myValuesComparator = Comparator
.comparingInt((Map.Entry<String, Values> entry) -> entry.getValue().a)
.thenComparingInt(entry -> entry.getValue().b)
.reversed();
然后通过调用 .stream()
将 hash.entrySet()
变成一个流,然后通过调用 .sorted(myValuesComparator)
使用比较器对条目流进行排序。最后您将排序后的条目收集到一个新的集合中,我们将在此处将它们收集到一个List<Map.Entry<String, Values>>
中。
List<Map.Entry<String, Values>> list = hash.entrySet()
.stream()
.sorted(myValuesComparator)
.collect(Collectors.toList());
如果你想检查结果,你可以放置一个断点并检查列表中的元素或者只打印整个列表
for (Map.Entry<String, Values> entry : list) {
System.out.printf("Key: %s, score: %d, time of last update: %d%n", entry.getKey(), entry.getValue().a, entry.getValue().b);
}
如果您将 Hashtable
更改为 HashMap
,同样的代码也适用,正如 Mark Rotteveel 在评论中所建议的那样,因为 Hashtable
被认为是过时的 class.
这是我的示例输出
Key: Test9, score: 11, time of last update: 3
Key: Test8, score: 11, time of last update: 2
Key: Test7, score: 11, time of last update: 1
Key: Test6, score: 10, time of last update: 3
Key: Test5, score: 10, time of last update: 2
Key: Test4, score: 10, time of last update: 1
Key: Test3, score: 1, time of last update: 3
Key: Test2, score: 1, time of last update: 2
Key: Test1, score: 1, time of last update: 1
输入
hash.put("Test1", new Values( 1, 1));
hash.put("Test2", new Values( 1, 2));
hash.put("Test3", new Values( 1, 3));
hash.put("Test4", new Values(10, 1));
hash.put("Test5", new Values(10, 2));
hash.put("Test6", new Values(10, 3));
hash.put("Test7", new Values(11, 1));
hash.put("Test8", new Values(11, 2));
hash.put("Test9", new Values(11, 3));
设置键值=hash.keySet();
keys.stream().forEach(System.out::println);