【问题标题】:How to sort an ArrayList of type <Entry<Character, Integer>>?如何对 <Entry<Character, Integer>> 类型的 ArrayList 进行排序?
【发布时间】:2016-10-25 15:00:25
【问题描述】:

我有一个名为 map 的 HashMap,它存储 Characters 作为键,Integers 作为值,然后我使用以下代码将其存储到称为条目的 ArrayList 中:

Set<Entry<Character, Integer>> s = map.entrySet();
ArrayList<Entry<Character, Integer>> entries = new ArrayList<>(s);

现在我正在尝试根据 Integer 值而不是键对这些条目进行排序。我尝试使用 lambda 表达式来实现 Comparator 接口,但它不起作用。这是我的代码:

Collections.sort(sortedEntries, (sortedEntries.get(0), sortedEntries.get(1)) -> { 
    sortedEntries.get(0).getValue().compareTo(sortedEntries.get(1).getValue())
});

这些是我得到的错误:

这一行有多个标记

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

  • Collections类型中的sort(List, Comparator)方法不适用于参数(ArrayList>, Map.Entry, Map.Entry)

  • 标记“->”的语法错误,;预计

【问题讨论】:

  • 表达式 (x,y)->(something) 不依赖于它之前的任何东西。它不应该引用sortedEntries。变量的名称只是为了让您可以在 lambda 表达式的主体中使用它们,并且它们的类型是比较器所期望的。
  • 如果你不理解 lambda,为什么还要使用它们?

标签: java arraylist comparator


【解决方案1】:

您可以这样按值对列表进行排序:

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

【讨论】:

  • 谢谢!这个解决方案效果很好。只是出于好奇想知道如何按降序对其进行排序?
  • Comparator 接口中有一些方便的方法。有一种方法reversed 可以以相反的顺序获得Comparator 。要按条目值的倒序对列表进行排序,您可以使用:list.sort(Comparator.comparing(Entry&lt;Character, Integer&gt;::getValue).reversed());
【解决方案2】:

这是严格按照您的代码请参阅

Collections.sort(sortedEntries, (Entry<Character,Integer> o1, Entry<Character,Integer> o2)-> {return o1.getValue().compareTo(o2.getValue());}); 

【讨论】:

    【解决方案3】:

    地图、列表或您尝试排序的类型没有什么特别之处。您对此类列表进行排序的方式与对元素属于不实现 Comparable 的类型的任何 List 的排序方式相同 - 通过使用 Comparator,就像您尝试做的那样。所以你在正确的轨道上。

    也许如果您对 lambda 表达式不满意,请尝试实现 Comparator 接口。类型系统会强制你“做正确的事”,而不是依靠你把事情做对,这样它就可以为你推断出类型。

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

    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());
        }
    }
    

    现在,如果你真的想使用 lambda 表达式,你只需要看看这个实现中的 compare 方法。 lambda 表达式必须有两个参数,ab,并且它必须返回一个 int。因此,你会得到类似的东西:

    Collections.sort(list, (a, b) -> a.getKey().compareTo(b.getKey()));
    

    但是由于您已经在 J​​ava 8 世界中,您不妨在 Comparator 类上使用静态 comparing() 方法。它将Function 作为参数,它提取您要用来比较元素的键。在我的示例中,我通过 getKey() 的键比较了条目。我们可以用:: 操作符引用这个方法,所以你最终会得到一个这样的表达式(使用List 接口上新的sort() 方法):

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

    【讨论】:

      【解决方案4】:

      您可以像这样使用 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,则不会对其进行排序。这应该进入一个列表(或排序集)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-21
      • 2015-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多