Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何对类型为<;的ArrayList进行排序;进入<;字符,整数>>;?_Java_Arraylist_Comparator - Fatal编程技术网

Java 如何对类型为<;的ArrayList进行排序;进入<;字符,整数>>;?

Java 如何对类型为<;的ArrayList进行排序;进入<;字符,整数>>;?,java,arraylist,comparator,Java,Arraylist,Comparator,我有一个名为map的HashMap,它将字符存储为键,将整数存储为值,然后使用以下代码将其存储到名为entries的ArrayList中: Set<Entry<Character, Integer>> s = map.entrySet(); ArrayList<Entry<Character, Integer>> entries = new ArrayList<>(s); 以下是我得到的错误: 这条线上有多个标记 语法错误,请插入“

我有一个名为map的HashMap,它将字符存储为键,将整数存储为值,然后使用以下代码将其存储到名为entries的ArrayList中:

Set<Entry<Character, Integer>> s = map.entrySet();
ArrayList<Entry<Character, Integer>> entries = new ArrayList<>(s);
以下是我得到的错误:

这条线上有多个标记

  • 语法错误,请插入“)”以完成表达式

  • 类型集合中的方法排序(列表、比较器)不适用于参数(ArrayList>、Map.Entry、Map.Entry)

  • 标记“->”上的语法错误;期望


您可以通过以下方式按值对列表进行排序:

list.sort(Comparator.comparing(Entry::getValue));

您可以使用Java Stream API对实体进行如下排序:

Set<Entry<Character, Integer>> s = map.entrySet();
List<Entry<Character, Integer>>  sortedEntries = s.stream()
            .sorted((a, b)-> Integer.compare(a.getValue(), b.getValue()))
            .collect(Collectors.toList());
Set s=map.entrySet();
列表sortedEntries=s.stream()
.sorted((a,b)->Integer.compare(a.getValue(),b.getValue())
.collect(Collectors.toList());
这严格按照您的代码执行,请参见
Collections.sort(sortedEntries,(条目o1,条目o2)->{return o1.getValue().compareTo(o2.getValue());});

您尝试排序的地图、列表或类型没有什么特别之处。对这样一个列表进行排序的方式与对其元素类型不实现Comparable的任何列表进行排序的方式相同——使用比较器,就像您试图做的那样。所以你走对了方向

如果您对lambda表达式不满意,可以尝试实现Comparator接口。类型系统将迫使您“正确操作”,而不是依赖您来正确操作,以便它可以为您推断类型

(我在这里使用条目的键,但您也可以使用值)

但是,既然您已经进入了Java8世界,那么最好在Comparator类上使用静态方法。它将一个
函数
作为参数,该函数提取要用于比较元素的键。在我的示例中,我通过
getKey()
按键比较了条目。我们可以使用
::
操作符引用此方法,因此您最终得到如下表达式(使用列表界面上的新方法):


表达式(x,y)->(某物)不依赖于它前面的任何内容。它不应参考
分拣机配件
。变量的名称仅用于在lambda表达式体中使用它们,并且它们的类型是比较器所期望的。如果不理解它们,为什么要使用lambda?如果将其放入
集中,结果将不会被排序。这应该进入一个列表(或一个排序集)。谢谢!这个解决方案非常有效。出于好奇,我想知道如何按降序排序?在
Comparator
接口中有一些方便的方法。有一种方法
反向
以反向顺序获得
比较器。要按条目值的相反顺序对列表进行排序,可以使用:
list.sort(Comparator.comparing(Entry::getValue.reversed())
Set<Entry<Character, Integer>> s = map.entrySet();
List<Entry<Character, Integer>>  sortedEntries = s.stream()
            .sorted((a, b)-> Integer.compare(a.getValue(), b.getValue()))
            .collect(Collectors.toList());
Collections.sort(sortedEntries, (Entry<Character,Integer> o1, Entry<Character,Integer> o2)-> {return o1.getValue().compareTo(o2.getValue());}); 
public class EntryKeyComparator implements Comparator<Entry<Character,Integer>> {
    @Override
    public int compare(Entry<Character,Integer> a, Entry<Character,Integer> b) {
        return a.getKey().compareTo(b.getKey());
    }
}
Collections.sort(list, (a, b) -> a.getKey().compareTo(b.getKey()));
list.sort(Comparator.comparing(Entry::getKey));