在Java

时间:2019-04-02 12:51:06

标签: java sorting hashmap

我有一个哈希图:

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

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

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

该怎么做?

4 个答案:

答案 0 :(得分:2)

在处理连续键时,Map<Integer, ____>几乎总是错误地选择数据结构。

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

您知道这是什么吗?它实际上只是一个列表。使用List<List<String>>it'll make your life easier

答案 1 :(得分:0)

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

以下代码可用于Comparator的比较方法中,该方法可提供给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替换为任何列索引。

答案 2 :(得分:0)

如果要订购地图,则使用的是TreeMap。

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

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

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

答案 3 :(得分:0)

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

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());