当前位置: 首页 > 知识库问答 >
问题:

排序一个哈希表的最佳方法是什么,它有一个类作为Java中多个变量(整数)的值?

轩辕经国
2023-03-14

我有一个系统要检查,以便在哈希表中按值排序,它用于获取该哈希表中的顶部字符串。我想在该哈希表中设置另一个值,所以我在其中使用了一个类,如下所示:

Map

该类:

public class Values {
    public Integer a;
    public Integer b;

    public Values(Integer a, Integer b) {    
        this.a = a;
        this.b = b;
    }    
}

我的目标是对哈希表中的所有值(整数a和b)进行排序,并返回显示谁的值最高的哈希表字符串(如数据库系统),可以这样做吗?我这样做的原因是为了在游戏中获得最好的杀手,按整数a排序,并设置最后一次杀戮在整数b中完成的时间,因此如果玩家在另一个之前杀戮,并且杀戮数量相同,那么首先会显示整数b最高的一个,变量b中时间(毫秒)最长的一个。

做这样的事情最好的方法是什么?


共有1个答案

常枫涟
2023-03-14

要获得自定义排序顺序,您需要定义一个比较器,指定要比较的值的顺序,以及是否有任何值需要按相反顺序排序。

从你的描述中,我认为你希望a是第一个降序排序的,然后b也是降序排序的。如果不是这样,请在评论中告诉我。

Comparator<Values> myValuesComparator = Comparator
        .comparingInt((Values v) -> v.a)
        .thenComparingInt((Values v) -> v.b).reversed();

然后将设置为可散列。通过调用将values()导入流中。stream(),然后通过调用,使用比较器对值流进行排序。已排序(myValuesComparator)。最后将排序后的值收集到一个新集合中,我们将在此处将它们收集到一个列表中。

List<Values> list = hash.values()
    .stream()
    .sorted(myValuesComparator)
    .collect(Collectors.toList());

如果要检查结果,可以放置断点并检查列表中的元素,或者只打印整个列表

for (Values v : list) {
    System.out.printf("Score: %d, time of last update: %d%n", v.a, v.b);
}

如果您将Hashtable更改为HashMap,正如Mark Rotterveel在评论中所建议的那样,同样的代码也可以使用,因为Hashtable被认为是过时的类。

编辑:这是我的示例输出

Score: 11, time of last update: 3
Score: 11, time of last update: 2
Score: 11, time of last update: 1
Score: 10, time of last update: 3
Score: 10, time of last update: 2
Score: 10, time of last update: 1
Score: 1, time of last update: 3
Score: 1, time of last update: 2
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));

 类似资料:
  • 问题内容: 假设我有两个或两个以上相同长度的列表。遍历它们的好方法是什么? ,是列表。 要么 还是我缺少任何变体? 使用一个相对于另一个有什么特别的优势吗? 问题答案: 通常的方法是使用: 这将停止两个iterables时较短且耗尽。另外值得注意的是:(仅适用于Python 2)和(适用于Python 3)。

  • 本文向大家介绍在JavaScript中声明多个变量的最佳方法是什么?,包括了在JavaScript中声明多个变量的最佳方法是什么?的使用技巧和注意事项,需要的朋友参考一下 当然,以下声明多个变量的方法更有效: 假设您需要添加,删除或更新变量,则可以轻松实现。 但是使用以下方法,您需要做更多更改。例如,在删除变量时,您需要删除分号。如果是第一个,则需要将var添加到第二个变量。

  • 问题内容: 我正在阅读Joshua Bloch撰写的Effective Java 项目15 。在第15项中,谈到“最小化可变性”时,他提到了使对象不可变的五个规则。其中之一是使所有字段最终确定。这是规则: 将所有字段都设为最终字段 :这可以通过系统强制地表达您的意图。同样,如果对新创建实例的引用从一个线程传递到另一个线程而没有同步,则必须确保正确的行为,如在内存模型中阐明的那样[JLS,17.5;

  • 在我的主课程中,我有一段代码: 在我的类中有一个名为的方法,它应该接收uniqueID作为参数。这可能吗,当是时,如何? 我还有一种方法,即按字母顺序对ArrayList进行排序,如果两个名字相等,则应首先打印工资较高的员工。它按字母顺序对列表进行排序,但不检查薪水是否更高。我需要改变什么?

  • 问题内容: 我正在尝试将变量初始化为零,所以目前看起来像这样 它可以工作,但似乎有点多余。有没有更清洁的方法? 问题答案: 我通常会做 但是,这并不重要。这两个版本一目了然。

  • 这段代码(从来历不明的LZW压缩程序中提取)在大小为5021的哈希表中找到一个空槽,索引从0到5020: 这不是典型的线性或二次探测。为什么要这样调查?这是一种已知的探测算法吗?我在哪里可以找到更多关于它的信息?