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

以LinkedList为键排序LinkedHashMap

羊舌自强
2023-03-14
LinkedHashMap<LinkedList<Integer>, float[]> hm = new LinkedHashMap<>();
LinkedList<Integer> linkedlist;

linkedlist = new LinkedList<>();
linkedlist.add(10);
linkedlist.add(7);
hm.put(linkedlist, new float[]{0.14f, 1.2f, 85.01f});

linkedlist = new LinkedList<>();
linkedlist.add(0);
linkedlist.add(41);
hm.put(linkedlist, new float[]{10.3f, 50.05f, 9.9f});

linkedlist = new LinkedList<>();
linkedlist.add(210);
linkedlist.add(3);
hm.put(linkedlist, new float[]{17.0f, 4.0f, 2.1f});

现在我想要的输出是:

{0,41},{10.3f,50.05f,9.9f}

{10,7},{0.14f,1.2f,85.01f}

LinkedHashMap<LinkedList<Integer>, float[]> sortedMap = new LinkedHashMap<>();
hm.entrySet()
    .stream()
    .sorted(Map.Entry.comparingByKey())
    .forEachOrdered(x -> sortedMap.put(x.getKey(), x.getValue()));
hm = sortedMap;
for (int i = 0; i < hm.size(); i++) {
    if (i < 50) {
        for (Map.Entry<LinkedList<Integer>, float[]> entry : hm.entrySet()) {
            LinkedList<Integer> k = entry.getKey();
            System.out.println(k);
        }
    }
}

共有1个答案

陈俊郎
2023-03-14

这种方法的问题是,您所拥有的键LinekdList 不是carable。您可以通过提供自定义的比较器来克服这一问题。

实现这种比较器的一种常见方法是比较匹配位置的整数,直到找到不相等的一对。如果其中一个列表比另一个短,并且在它结束之前没有击中其中的不匹配元素,则可以将其定义为比长列表“更小”:

Comparator<LinkedList<Integer>> cmp = new Comparator<LinkedList<Integer>>() {
    @Override
    public int compare(LinkedList<Integer> o1, LinkedList<Integer> o2) {
        Iterator<Integer> i1 = o1.iterator();
        Iterator<Integer> i2 = o2.iterator();

        // Iterate over the first list
        while (i1.hasNext()) {
            Integer x1 = i1.next();

            // If the second list has no more elements, it's "smaller"
            if (!i2.hasNext()) {
                return 1;
            }

            Integer x2 = i2.next();
            int cmp = Integer.compare(x1, x2);
            if (cmp != 0) {
                // If the matching items aren't equal, we know which list is "smaller"
                return cmp;
            }
        }

        // Done going over the first list.
        // If the second one still has items, it's "bigger"
        if (i2.hasNext()) {
            return -1;
        }

        // If not, both lists are equal
        return 0;
    }
};

一旦有了比较器,您只需使用它对映射的键进行排序

LinkedHashMap<LinkedList<Integer>, float[]> sortedMap = new LinkedHashMap<>();
hm.entrySet()
        .stream()
        .sorted(Map.Entry.comparingByKey(cmp)) // Here
        .forEachOrdered(x -> sortedMap.put(x.getKey(), x.getValue()));
hm = sortedMap;
 类似资料:
  • 问题内容: 哪个实现不太“繁重”:PriorityQueue或排序的LinkedList(使用Comparator)? 我想对所有项目进行排序。插入将非常频繁,有时我将必须运行所有列表以进行一些操作。 问题答案: A 是最糟糕的选择。要么使用(或更一般地说,是一个实现者),要么。如果确实使用列表,则仅在遍历列表内容之前对其进行排序,而不是在每次插入之后对其进行排序。 有一点要注意的是,迭代器 不

  • 我有下面的代码,我在一个整数排序的LinkedList中插入了一个新的整数,但我不认为这是“正确”的方法,因为我知道,有指向下一个值的单LinkedList和指向下一个和上一个值的双LinkedList。我试图使用节点来实现以下情况,但Java正在导入这个导入组织。w3c。多姆。节点(文档对象模型)因此卡住了。 插入盒 > }

  • 我试图使用batchGetItem从表中返回多个项的属性,但似乎它只适用于分区键和范围键的组合,但是如果我只想通过主键识别请求的项,该怎么办?唯一的方法是创建不带范围键的表吗? 根据官方留档: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.Partitions.html 如果表有一个复合主键(分

  • 问题内容: 表是由其主键本质上排序的吗?如果我有一个在BigInt标识列上具有主键的表,我可以相信查询将始终返回按键排序的数据,还是我明确需要添加“ ORDER BY”。性能差异很大。 问题答案: 数据通过聚簇索引进行物理存储,聚簇索引通常是主键,但不一定是主键。 如果没有ORDER BY子句,则不能保证SQL中的数据具有顺序。当您需要按特定顺序排列数据时,应始终指定ORDER BY子句。如果表已

  • 问题内容: 我想使用需要不时进行排序的数据结构。数据结构的大小几乎不会超过1000个项目。 哪一个是更好的- 或者? 哪种排序算法更好用? 问题答案: 在Java 7之前,它没有什么区别,因为它将列表的内容转储到数组中。 在Java 8中,使用会稍微快一些,因为它将调用并具有专门的版本,该版本可以直接对后备数组进行排序,从而保存副本。 因此,根据Java版本的不同,底线更好,因为它可以提供相似或更

  • 问题内容: 我在Redis(Spring Data Redis)中有以下键, 如果要根据 ID /名称/站点 进行排序,该怎么做? 和, 不工作。 问题答案: 该代码位于文章的最后,如果您熟悉redis中的多hset键排序的原理,请跳过以下内容并直接阅读代码。 Redis Sort旨在对List / Set / Zset中的字段进行排序,但是该方法可用于根据所需的指定指标对多键进行排序。我们可以使