当前位置: 首页 > 知识库问答 >
问题:

如何在Map.Entry中为映射值编写java 8比较器

冷正信
2023-03-14

这是我得到的,我想按条目中的值降序排序。

Map<String, Outer> outer = Input
                          .entrySet()
                          .stream
                          .collect(toMap(Map.Entry::getKey, entry->{
                           List<Outer> inner = entry
                                    .getValue()
                                    .stream()
                                    .sorted(Comparator.comparingDouble(???))
                              })) ... (more lines of code.)

如何用排序编写比较器。如果想在排序后执行以下操作

if (o1.getSomething() > o2.getSomething())
     return -1;
if (o1.getSomething() < o2.getSomething())
     return 1;
return 0;

在得到列表并排序后,它对我有效。

inner.sort((Outer o1, Outer o2) -> {
if (o1.getSomething() > o2.getSomething())
         return -1;
    if (o1.getSomething() < o2.getSomething())
         return 1;
    return 0;
});

但是有没有办法在条目内使用stream.sorted(“在这里使用相同的比较器逻辑”)。

Entry是一个数组列表,有一堆值。

entry:[{w:1},{w:2},{w:3},{w:4}];

所以我想对此进行反向排序,如下所示:

entry:[{w:4},{w:3},{w:2},{w:1}];

所以我得到的最终列表是按相反顺序排序的。

为混乱而哭泣。

共有3个答案

程化
2023-03-14

据我所知,您的问题实际上只是如何创建一个排序列表作为映射中的值,并根据getWhat的返回进行排序。

entry.getValue().stream()
    .sorted(Comparator.comparing(Outer::getSomething))
    .collect(toList())

将返回根据< code>getSomething排序的列表。如果该方法返回一个double,那么您可以使用< code > comparing double(Outer::get something)来避免对该值进行装箱。

哈扬
2023-03-14

如果您只是试图获取< code>Map的值,并将它们放入排序的< code>List中,您可以执行以下操作:

Map<String, Element> elMap = new HashMap<>();
elMap.put("3", new Element("3"));
elMap.put("2", new Element("2"));
elMap.put("1", new Element("1"));

List<Element> elList = elMap.values()
        .stream()
        .sorted((e1, e2) -> {
            return e1.getSortField().compareTo(e2.getSortField());
        })
        .collect(Collectors.toList());
System.out.println(elList);

在这里,元素是一个简单的POJO,有一个名为<code>sortField<code>的<code>字符串sorted()接受一个比较器。这是一个具有2个参数和<code>int<code>返回类型的函数接口。这对于给定的λ是可以的。

您还可以让元素实现< code>Comparable。那么你可以做:

List<Element> elList = elMap.values()
        .stream()
        .sorted()
        .collect(Collectors.toList());

与元素实现正确的接口

static class Element implements Comparable<Element> {
    //Constructor, field, getters
    @Override
    public int compareTo(Element o) {
        return this.sortField.compareTo(o.sortField);
    }
}

编辑:

这是地图中的一个列表,我正在尝试对它进行排序。并试图在链条中进行分类。

这可以解释为:

Map<String, List<Element>> collected = elMap.entrySet()
        .stream()
        .peek(entry -> System.out.println("Performing arbitrary Map operations"))
        .collect(Collectors.toMap(Map.Entry::getKey, entry -> {
            return entry.getValue()
                    .stream()
                    .sorted(Comparator.comparingDouble(Element::getWeight))
                    .collect(Collectors.toList());
        }));

collected.entrySet()
        .forEach(entry -> {
            System.out.println(entry.getKey() + " : " + entry.getValue());
        });

您可以流式传输“Map.entrySet()”并对其做任何您想做的事情。根据您的问题将其收集回不同的Map时,您可以使用上面的示例再次流式传输和收集您的List

娄弘
2023-03-14

您可以定义< code >比较器,然后使用< code>stream.sorted(),如下所示,带有行内注释:

//Define comparator Lamda exp for Outer class
Comparator<Outer> outerComparator = (o1, o2) -> {
         if (o1.getValue() > o2.getValue())
                return -1;
          else if (o1.getValue() < o2.getValue())
                return 1;
            else 
              return 0;
   };


Map<String, Outer> output = Input.entrySet(). //get elements
        stream(). //get elements
        sorted( //sort elements by passsing outerComparator
        Map.Entry.<String, Outer>comparingByValue(outerComparator)
        .reversed())//reverse for descending order
        .collect(Collectors.toMap(Map.Entry::getKey, 
        Map.Entry::getValue));//collect to Map object
 类似资料:
  • 如何编写java。util。映射到avro?在GenericData中,我看到了记录等的条目,但没有看到映射的条目。同样的问题也存在http://apache-avro.679487.n3.nabble.com/How-to-write-an-AVRO-map-Something-like-GenericData-Map-td3407527.html,但我不知道到底是怎么做到的。

  • 下面的代码片段适用于条件1,但不适用于条件2。

  • 输入: 输出: 输入: 线程“main”java.lang.IllegalStateException中的异常:重复键-1.0 我怎么才能修好这个?

  • 我刚刚开始看Java8,为了尝试lambdas,我想我应该尝试重写我最近写的一个非常简单的东西。我需要将一个字符串到列的映射转换为另一个字符串到列的映射,其中新映射中的列是第一个映射中列的防御副本。列具有复制构造函数。到目前为止我得到的最接近的数据是: 但我相信一定有更好的方法来做这件事,我会很感激一些建议。

  • 我有一个ArrayList,需要按降序排序。我用java来实现它。util。流动流动排序(比较器)方法。以下是根据Java API的描述: 返回由该流的元素组成的流,根据提供的

  • 我有个问题。我在enter中得到了一个csv,其值如下: 该文件的名称类似于:AB01_TEST_ABDC_YYYYMMDd.csv 我需要把它们放到一张地图上,就像: Bar是csv中一行的bean,Foo是由Bar的一些元素创建的bean 现在,我成功地通过CSV的第一列值将列表拆分为一个映射。这给了: 我是这样做的: baz必须被csv的第一列和每个第一列值的行的itération拆分。因为