【问题标题】:Sort out a List<Map> in Java 7在 Java 7 中对 List<Map> 进行排序
【发布时间】:2015-12-17 18:44:20
【问题描述】:

我有一个 List&lt;Map&lt;String, String&gt;&gt; 类型的数据结构,我希望根据值整理列表中的所有 Map 值。例如 - 迭代时的列表给出了一个由两个键值对组成的 Map。

Map1--> Key1:  abc and key2: Sometext2
Map2 --> Key1: cbd and key2: Sometext2
Map3 --> Key1: bcd and key2: Sometext2
.
.
.
.

等等。 我希望通过映射到 key1 的值按字母顺序对数据结构进行排序,因此它应该如下所示:

Map1--> Key1:  abc and key2:Sometext2.
Map3 --> Key1: bcd and key2: Sometext2
Map2 --> Key1: cbd and key2: Sometext2
.
.
.
.

我正在使用 Java 7。非常感谢任何帮助。

谢谢

【问题讨论】:

  • Comparator开头
  • 是的,我知道我必须实现一个比较器,但无法理清逻辑。
  • 如果所有的地图都有两个键/值对,每次都有相同的键,也许你应该为此创建一个类?

标签: java sorting


【解决方案1】:

根据您的示例,您的Map 只是一对(String, String)

所以我们可以这样做:

public class MyCouple {
    private String first;
    private String second;
    // + constructors, getters, setters
}

List<MyCouple> couples = // ...
Collections.sort(couples, new Comparator<MyCouple>(){
    @Override
    public int compare(MyCouple c1, MyCouple c2) {
        return c1.getSecond().compareTo(c2.getSecond()); // sort by second
    }
});

【讨论】:

    【解决方案2】:

    您可以为地图使用包装类,然后为您的列表获取迭代器。像这样的:

    class MapWrapper implements Comparable<Map> {
        private Map<String, String> map;
    
        public MapWrapper (Map<String, String> map) {
            this.map = map;
        }
    
        public int compareTo() {
            do stuff
        }
    }
    

    【讨论】:

      【解决方案3】:

      我有类似的要求,我开发了一张类似的地图。类声明是:

      public class ComparableMap<K,V> extends TreeMap<K,V> implements Comparable<ComparableMap<K,V>> {
          @Override
          public int compareTo(ComparableMap<K,V> o) {...}
      }
      

      由于 TreeMap 迭代器返回排序后的键,为了比较 2 个映射,您遍历键,比较每个键,直到键不相等,或者对于相等的键,值不相等,根据哪个较小返回适当的结果.当到达一个keyset的末尾时,如果另一个keyset有key,那么它们也不相等,你会返回适当的比较结果。

      最后,您可以使用 Collections.sort() 对地图列表进行排序,因为 compareTo 方法将用于确定排序顺序。

      希望这能给你一些想法。

      如果您希望对所有映射中的单个键进行排序,您可能已经生成了一个合并映射。​​

      【讨论】:

      • 您可以根据需要实现 compareTo() 以适当地订购您的地图。
      【解决方案4】:

      试试这个

      static <T> Map<String, T> makeMap(String k1, T v1, String k2, T v2) {
          Map<String, T> map = new LinkedHashMap<>();
          map.put(k1, v1);
          map.put(k2, v2);
          return map;
      }
      
      public static void main(String[] args) {
          List<Map<String, Integer>> list = Arrays.asList(
              makeMap("abc", 1, "Sometext2", 1),
              makeMap("cde", 2, "Sometext2", 2),
              makeMap("bcd", 3, "Sometext2", 3)
          );
          System.out.println("before: " + list);
          Collections.sort(list, new Comparator<Map<String, Integer>>() {
      
              @Override
              public int compare(Map<String, Integer> o1, Map<String, Integer> o2) {
                  return o1.keySet().iterator().next()
                      .compareTo(o2.keySet().iterator().next()); 
              }
      
          });
          System.out.println("after:  " + list);
      }
      

      结果:

      before: [{abc=1, Sometext2=1}, {cde=2, Sometext2=2}, {bcd=3, Sometext2=3}]
      after:  [{abc=1, Sometext2=1}, {bcd=3, Sometext2=3}, {cde=2, Sometext2=2}]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-11
        • 1970-01-01
        • 2014-04-03
        • 2021-03-26
        • 1970-01-01
        • 1970-01-01
        • 2017-02-09
        相关资源
        最近更新 更多