所以我正在尝试对包含人名(密钥)及其年龄和身高(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;
}
我一直试图让它工作大约一个半小时,我几乎放弃了。请帮忙!
答案 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()));