我必须创建Sorted方法,使用map参数和lambda-expression调用。该方法返回作为第一个参数传递的任何映射的排序版本,排序顺序由作为第二个参数给出的lambda表达式确定。
我创造了类似的东西(不正常工作):
public Map sorted(Map map, Function<Set> funct){
System.out.println(map.entrySet()
.stream()
.sorted((Comparator) funct)
.collect(Collectors.toList()));
return null;
}
有什么想法吗?
谢谢你的帮助;)
答案 0 :(得分:3)
如果您希望有序地图是$(document).ready(function() {
var table = $('#userTable').DataTable( {
"sAjaxSource": "/MyApp/proctoring/user/getAll",
"sAjaxDataProp": "users",
"columns": [
{ "data": "username" },
{ "data": "name" },
{ "data": "surname" },
{ "data": "status" },
{ "data": "emailAddress" },
{ "data" : "userId" }
],
"aoColumnDefs": [
{
"aTargets": [5],
"mData": "userId",
"mRender": function (data, type, full) {
return '<button href="#"' + 'id="'+ data + '">Edit</button>';
}
}
]
} );
$('#userTable tbody').on( 'click', 'button', function () {
var data = table.row( $(this).parents('tr') ).data();
console.log(data);
$('#userEditModal').modal('show');
});
} );
而假设比较器按TreeMap
排序,则它可能如下所示:
Key
对它的调用就像这样:
public static <K, V> TreeMap<K, V> sorted(Map<K, V> map, Comparator<? super K> cmp) {
return map.entrySet()
.stream()
.collect(Collectors.toMap(Map.Entry::getKey,
Map.Entry::getValue,
(left, right) -> left,
() -> new TreeMap<K, V>(cmp)));
}
答案 1 :(得分:2)
当我读到这个问题时,我想到了一个更通用的解决方案,你可以在键或值上对地图进行排序。在这种情况下,解决方案如下所示:
public static <K,V> Map<K,V> sorted(Map<K,V> map, Comparator<Map.Entry<K, V>> comparator){
return map.entrySet()
.stream()
.sorted(comparator)
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
}
如果您想要按值排序,可以使用以下方法:
sorted(yourMap, Entry.comparingByValue());
答案 2 :(得分:-1)
Function声明了2个通用参数: T 和 R ,但您只提供了1个通用参数Set
。
将流收集到地图,您可以使用Collectors.toMap而不是Collectors.toList来收集列表的流。
Comparator更像是BiFunction / ToIntBiFunction,因为功能界面的通用参数包括参数&amp;返回类型。
如果您希望将ToIntBiFunction
推荐给Comparator
,您可以使用此功能:
void sortByEntry() {
Map<?, ?> map = new HashMap<>();
Map<?, ?> sorted = sorted(map, this::comparingEntry);
}
<K, V> Map<K, V> sorted(Map<K, V> map,
ToIntBiFunction<Entry<K, V>, Entry<K, V>> comparator) {
return map.entrySet().stream()
.sorted(comparator::applyAsInt)
.collect(Collectors.toMap(Entry::getKey, Entry::getValue
, (v1, v2) -> v2, LinkedHashMap::new));
}
<K, V> int comparingEntry(Entry<K, V> left, Entry<K, V> right) {
return ...;
}