【问题标题】:understanding comparator in Collections.max理解 Collections.max 中的比较器
【发布时间】:2017-12-11 12:58:49
【问题描述】:

有人可以解释一下以下代码行的含义吗?我很难理解 Comparator 部分。我尝试用谷歌搜索,但所有这些都太复杂了,我无法理解。有人可以用更简单的方式解释一下吗?

String maxLengthString = Collections.max(dateStrings, Comparator.comparing(s -> s.length()));

【问题讨论】:

  • 没什么特别的。我们在列表中使用 Java 流,比较器一次选择一个元素,即一个字符串并检查其长度。因此,这里将列表的元素与它们的长度进行比较以给出最长的元素
  • 你已经了解了其中的哪些部分?
  • 直到 .max(dateStrings,
  • *Lambda。对不起????
  • @xxxvodnikxxx 是的,你是对的。

标签: java collections comparator


【解决方案1】:

max 方法返回集合中被认为是“最大”的元素。

在这种情况下,您有一个字符串集合。默认情况下,字符串按字母顺序进行比较。当您按字母顺序排列字符串时,顶部的被认为具有较小值的字符串,而底部的那些被认为具有较大值的字符串。

但是,在您的问题中编写代码的人不希望以这种方式比较字符串。他/她想按长度比较字符串。所以更长的字符串意味着“更大”的字符串。

您可以将第二个参数传递给max,指定您希望如何比较字符串。由于您想按长度比较它们,因此您传入:

Comparator.comparing(s -> s.length())

一些你可能会觉得有用的有用的东西:

【讨论】:

  • @ArunGowdru 您可以将字符串转换为您喜欢的任何类似的东西。对于(一个荒谬的)示例,您可以计算字符串中有多少个“a”并进行比较!只需将其逻辑放入 comparing 的 lambda 表达式中,然后返回您要比较的值。
  • 如果这听起来很酷,但写“顶部的那些是“小”字符串,而底部的那些是“大”字符串”可能会混淆一些人。
  • @AakashVerma 现在呢?你有什么建议我可以放在那里?
  • @Sweeper 更好。您可能想检查 assylias 答案的 cmets 部分。
【解决方案2】:

如果你打电话:

String max = Collections.max(dateStrings);

您将使用字符串的自然顺序获得集合中的最大字符串。换句话说,它将是最大的按字典顺序。因此,如果列表包含“aa”、“bb”、zz”、“cc”,则 max 将为“zz”。

您的示例想要检索列表中最长的字符串。所以你需要提供一个自定义的比较器,它会根据字符串的长度来比较字符串。

【讨论】:

  • 字典式在这里会是一个更好的词吗?
  • 我需要最新的日期。移除比较器部分会解决这个问题吗?
  • @Arun Gowdru 不,因为您需要列表中的 Date 对象以获得具有日期比较的正确日期,而不是字符串。任何实现了 Comparable 接口或 Comparator 的类都可以直接提供给 Collections 比较器。如果您正在处理本机 Date 对象,那么没有那个 lambda 部分就可以了。否则,您必须定义自己的 Comparator。
猜你喜欢
  • 2011-01-15
  • 2011-04-11
  • 2021-06-14
  • 2021-07-08
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
相关资源
最近更新 更多