【问题标题】:Convert Map<> to Map<String,String>将 Map<> 转换为 Map<String,String>
【发布时间】:2016-07-29 11:30:15
【问题描述】:

我有一些这样的代码,我尝试通过 sortby 中给出的键对 Map 列表中的值进行排序。代码如下:

final String sortby = "first";
    List<Map> lm = new ArrayList<Map>();
    Map m = new HashMap();
    m.put("id", "eka");
    m.put("first", "ek");
    m.put("last", "a");
    lm.add(m);
    m = new HashMap();
    m.put("id", "adit");
    m.put("first", "adi");
    m.put("last", "t");
    lm.add(m);

    for(Object M : lm){
        System.out.println(M.toString());
    }

    Comparator<Map<String,String>> mapComparator = new Comparator<Map<String,String>>() {
        public int compare(Map<String,String> m1, Map<String,String> m2) {
            return m1.get(sortby).compareTo(m2.get(sortby));
        }
    };

    Collections.sort(lm, mapComparator);

    for(Object M : lm){
        System.out.println(M.toString());
    }

但它无法使用比较器进行比较,因为数据类型不兼容。如何将 Map&lt;&gt; 转换为 Map&lt;String,String&gt; 或任何其他建议,以便比较器可以比较所有数据类型?

【问题讨论】:

  • 你为什么不把最初的List&lt;Map&gt;变成List&lt;Map&lt;String,String&gt;&gt;
  • 因为地图的输入并不总是字符串
  • 当你使用原始类型时会发生这种情况。
  • @EkaCahyaPratama 在这里使用原始类型并不是最好的选择。然后您可能想重新考虑地图,并可能将输入包装在类似于不同可能类的通用包装器类中。
  • Map&lt;String, Comparable&lt;?&gt;&gt; 怎么样?或new Comparator&lt;Map&lt;? extends Object,? extends Comparable&lt;?&gt;&gt;&gt;().

标签: java list dictionary type-conversion comparator


【解决方案1】:
class MapComparator<K,V extends Comparable<V>> implements Comparator<Map<K,V>> {

  public int compare(Map<K,V> m1, Map<K,V> m2) {
     return m1.get(sortby).compareTo(m2.get(sortby));
  }

}

【讨论】:

    【解决方案2】:

    您正在为 lmm 变量使用原始类型。您可以将代码更改为以下内容:

    List<Map<String, String>> lm = new ArrayList<>();
    Map<String, String> m = new HashMap<>();
    // ...
    
    m = new HashMap<>();
    // ...
    
    for (Map<String, String> map : lm)
    {
        // ...
    }
    
    // ...
    
    for (Map<String, String> map : lm)
    {
        // ...
    }
    

    请注意,ArrayList 构造函数使用&lt;&gt; 而不是&lt;Map&gt;,表示从赋值左侧(Map&lt;String, String&gt;)推断出的类型。你也可以这样写:

     List<Map<String, String>> lm = new ArrayList<Map<String, String>>()
    

    这同样适用于HashMap 构造函数。

    【讨论】:

    • OP 说,他的输入并不总是一个字符串,所以他不能使用Map&lt;String, String&gt; 作为源映射。
    • 它与评论中的@KevinEsche 答案有何不同?
    猜你喜欢
    • 2013-05-24
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 2015-11-21
    • 2015-01-14
    • 2021-08-09
    相关资源
    最近更新 更多