java - 使用自定义比较器查找数组列表的最大值

标签 java java-8 java-stream comparator

我有一个早餐课,如下所示:

class Breakfast {

     String[] fruits;
     ...

     // Getter and Setter here
     ...
}

fruits 字段始终是一个大小为 2 的数组,包含三个可能值之一: {"apple", "pear"} , {"apple", "grape"}, {"pear", "grape"}

我为这三个值设计了一个自定义顺序,如下所示:

    String[] orderOne = {"apple", "pear"};
    String[] orderTwo = {"apple", "grape"};
    String[] orderThree = {"pear", "grape"};

我编写了自己的自定义比较器:

    List<String[]> breakfastOrder = Arrays.asList(orderOne, orderTwo, orderThree);

    Comparator<Breakfast> orderComparator = Comparator.comparing(b -> breakfastOrder.indexOf(new String[] {breakfast.getFruits()[0], breakfast.getFruits()[1]});

在处理早餐对象列表时,我希望找到“Max”水果组合。

换句话说,如果找到 {"pear", "grape"},则 {"pear", "grape"} 将是“Max”。如果没有找到{"pear", "grape"},但找到了{"apple", "grape"},则{"apple", "grape"}为最大值。

当我有早餐对象列表时,如何找到“最大”?该流有一个 max 函数,我可以将它与我的自定义比较器一起使用吗?

我在想这样的事情:

List<Breakfast> bList = //initialize the list

String[] max = bList.stream.max(orderComparator).get().getFruits();

如果 Java 11 中的任何部分发生了更改,请告诉我。此外,如果我的代码有任何问题或者我的逻辑/实现有缺陷,请告诉我。

最佳答案

如果您可以为 Breakfast 重写 equals/hashCode,请在此处进行简化(不要像这样编写 equals):

    @Override
    public int hashCode() {
        return Arrays.hashCode(fruits);
    }

    @Override
    public boolean equals(Object other) {
        Breakfast b = (Breakfast) other;
        return Arrays.equals(b.getFruits(), getFruits());
    }

您可以创建一个Map并保留索引(如果您愿意,您可以将其视为比较器的优势):

 Map<Breakfast, Integer> MAP = ImmutableMap.of(
        new Breakfast(new String[]{"pear", "grape"}), 1,
        new Breakfast(new String[]{"apple", "grape"}), 2,
        new Breakfast(new String[]{"apple", "pear"}), 3);

并通过以下方式对它们进行排序:

Breakfast max = Collections.max(
        yourListOfGrapes,
        Comparator.comparingInt(b -> Optional.ofNullable(MAP.get(b)).orElse(0))
                  .reversed());

关于java - 使用自定义比较器查找数组列表的最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55619826/

相关文章:

java - JUnit 如何测试 "printlist"?

java - 在MapReduce中分别处理多个输入文件

Java JDK - 为 macOS 下载时出现 404

java - 在 map java8 上用 lambda 计数器

java - 为什么 StreamEx 在收集到列表时强制我将 "? extends"添加到变量类型?

java - "The system cannot find the file specified"用于 .out 和 .in 扩展名

java - @GET 可以为 JAX-RS 实现定义 Consumes Content-Type 吗?

java - 从 lambda 内部修改局部变量

Java 11 根据枚举值选择一种方法应用于流

java - 如何处理 Java Streams 中的额外值?