使用泛型函数基于ArrayList中的索引对HashMap进行排序

时间:2014-12-04 23:01:37

标签: java generics arraylist hashmap

所以我正在尝试对包含人名(密钥)及其年龄和身高(cm)的HashMap进行排序。 HashMap的设置如下:

    Map<String, List<Integer>> s = new HashMap<>();
    List<Integer> l1, l2, l3, l4;
    l1 = new ArrayList<>();
    l2 = new ArrayList();
    l3 = new ArrayList();
    l4 = new ArrayList();
    l1.add(22); l1.add(177);  //age then height
    l2.add(45); l2.add(162);
    l3.add(19); l3.add(182);
    l4.add(38); l4.add(174); 
    s.put("John", l1);
    s.put("Eric", l2);
    s.put("Darren", l3);
    s.put("Carter", l4);

然后我想使用通用函数按人的高度对Map进行排序。

这就是我的尝试:

static <K, V extends List<? extends Comparable<? super V>>> Map<K, V> specialSort(Map<K, V> map) {
    Map<K, V> result = new LinkedHashMap<>();
    Stream<Entry<K, V>> st = map.entrySet().stream();
    st.sorted(Comparator.comparing(e -> e.getValue().get(0))).
            forEach(e -> result.put(e.getKey(), e.getValue()));

    return result;
}

但是我收到了这个错误:

incompatible types: inferred type does not conform to upper bound(s)
inferred: CAP#1
upper bound(s): Comparable<? super CAP#1>,V,Object
where V,K are type-variables:
V extends List<? extends Comparable<? super V>> declared in method <K,V>specialSort(Map<K,V>)
K extends Object declared in method <K,V>specialSort(Map<K,V>)
where CAP#1 is a fresh type-variable:
CAP#1 extends Comparable<? super V> from capture of ? extends Comparable<? super V>

我正在使用的基本功能来自这个主题:https://stackoverflow.com/a/2581754

这是功能:

public static <K, V extends Comparable<? super V>> Map<K, V> 
sortByValue( Map<K, V> map )
{
   Map<K,V> result = new LinkedHashMap<>();
   Stream <Entry<K,V>> st = map.entrySet().stream();

   st.sorted(Comparator.comparing(e -> e.getValue()))
        .forEach(e ->result.put(e.getKey(),e.getValue()));

   return result;
}

我一直试图让它工作大约一个半小时,我几乎放弃了。请帮忙!

1 个答案:

答案 0 :(得分:0)

好的,就像您对问题的评论中提到的那样,它实际上并不是面向对象的方法 但是对于使用泛型和lambdas来说,这很好。

当您同时声明List-type时,它将起作用。

public static <K, V extends Comparable<? super V>> Map<K, List<V>> sortByValue( Map<K, List<V>> map ) {
   Map<K,List<V>> result = new LinkedHashMap<>();
   Stream <Entry<K,List<V>>> st = map.entrySet().stream();

   st.sorted(Comparator.comparing(e -> e.getValue().get(1)))
     .forEach(e -> result.put(e.getKey(), e.getValue()));

   return result;
}    

或者,您可以这样使用排序方法:

st.sorted((e1,e2)->{return e1.getValue().get(1).compareTo(e2.getValue().get(1));})
  .forEach(e -> result.put(e.getKey(), e.getValue()));

用以下方法检查结果:

result.forEach( (name, list)-> System.out.println(""+name+":" + list.get(1).toString()));