【问题标题】:Sorting HashMap <Integer, List<String>> in Java [closed]在Java中对HashMap <Integer, List<String>>进行排序[关闭]
【发布时间】:2019-04-02 12:51:06
【问题描述】:

我有一个哈希图:

Map<Integer, List<String>> dataA = new HashMap<>();

包含从 Excel 电子表格导入的数据。 HashMap Keys 包含行号,HashMap Values 包含特定行中的单元格值列表。

现在我需要按列表中的特定列(或多列)对其进行排序。

怎么做?

【问题讨论】:

  • 这将是一个糟糕的数据结构。将其移动到数组或列表中并对其进行排序。您必须考虑诸如空行之类的事情以及如何处理它们。
  • 您是否尝试过查看类似 open csv 的内容? opencsv.sourceforge.net
  • 这个问题:Sort a Map by value,也许应该给你一个想法
  • 您能否提供更多关于您已经完成的工作或您当前解决方案的问题的详细信息?这是含糊不清的,给人的感觉是要求为您做作业。
  • 到目前为止你尝试了什么??谷歌你的问题,我相信有很多像你这样的。

标签: java sorting hashmap


【解决方案1】:

Map&lt;Integer, ____&gt; 在处理连续键时几乎总是错误的数据结构选择。

0 -> Foo
1 -> Bar
2 -> Baz

你知道这是什么吗?它实际上只是一个列表。使用List&lt;List&lt;String&gt;&gt;it'll make your life easier

【讨论】:

  • OP 没有说明行号是连续的或从 0 开始。
  • @BalzGuenat 它们是电子表格的行,因此它们一定是连续的。如果该行为空,您可以有一个空的List&lt;String&gt;
  • @BalzGuenat 它们是否从零开始并不重要。将它们存储为零索引,如果需要,将偏移量单独存储为整数,并在需要引用行时将其添加到索引中。
  • 仅当您插入电子表格的所有行时。可能是它们被过滤并保留了原始行号。
  • @Michael 谢谢。它工作得非常好,而且确实更容易维护。
【解决方案2】:

如果您想订购地图,则使用 TreeMap。

然后您需要一个用于订购键的类,例如MySortKey 实现 Comparable<...>。

然后,您需要一个方法,该方法可以从每个 List 生成适当的 MySortKey 对象,该对象 [当前] 是 Map 中的一个值。

然后您使用 .put(mySortKey, list) 填充 TreeMap,其中这两个变量是 MySortKey 和 List 对象。

【讨论】:

  • TreeMap 的问题是您需要在创建地图时定义比较器。如果您想根据不同的比较器对其重新排序怎么办?
  • 使用第二个比较器构建第二个地图。
  • 嗯,是的,或者一开始就不要使用地图。
  • 除了实现 Comparable 之外,您还可以将 Comparator 传递给 TreeMap 构造函数。
【解决方案3】:

获取值集并通过自定义比较器对其进行排序:

Comparator<Map.Entry<Integer, List<String>>> comp = 
  Comparator.comparing((Map.Entry<Integer, List<String>> e) -> e.getValue().get(firstColumnIndex))
            .thenComparing(e -> e.getValue().get(secondColumnIndex));
List<Map.Entry<Integer, List<String>>> sorted =
  map.entrySet().stream().sorted(comp).collect(Collectors.toList());

【讨论】:

  • 您不是暗示使用地图更容易吗? :D
  • 如果键不是 0-indexed 和连续的,这并不容易,但很有必要。该解决方案适用于任何输入映射,因为它不对键做任何假设。 (不过,它确实对值列表的长度做出了假设。)
【解决方案4】:

要按值部分对 hashmap 内容进行排序,请使用比较器并比较 hashmap 的值部分而不是 key 部分。

以下代码可用于 Comparator 的 compare 方法,可提供给 TreeMap 构造函数。

public int compare(Map.Entry<Integer, List<String>> o1,  
                               Map.Entry<Integer, List<String>> o2) 
            { 
                return (o1.getValue().get(0)).compareTo(o2.getValue().get(0)); 
            } 

在上面的代码中,将 0 替换为任何列索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多