如何比较 Pair 中的两个对象并返回最大一个

How to compare two objects in a Pair and return the max one

提问人:SNM 提问时间:2/2/2023 更新时间:2/2/2023 访问量:244

问:

我有一个类型的对象,现在我正在尝试返回其值比较较低的对象。Pair<Object1, Object2>

我在 kotlin 中看到我们有 followin 函数

/**
 * Returns the smaller of two values.
 * 
 * If values are equal, returns the first one.
 */
@SinceKotlin("1.1")
public actual fun <T : Comparable<T>> minOf(a: T, b: T): T {
    return if (a <= b) a else b
}

这个应该对我有用,因为我需要查看两个对象中哪一个具有最小值并返回该对象

所以我希望将对象返回为

minOf(pair.first.price, pair.second.price).storeName

但是这个屈服于双比较器

如何为这两个对象添加比较器并返回具有最小值的对象?

Android Kotlin OOP 数学

评论


答:

1赞 CommonsWare 2/2/2023 #1
if (pair.first.price <= pair.second.price) pair.first else pair.second

评论

0赞 SNM 2/2/2023
是的,已经这样做了,但是我想使用上述功能,有办法吗?
0赞 CommonsWare 2/2/2023
@SNM:不是直接的。您可以在任何类上实现它,并让它用于比较。然后,您将使用 .或者,使用具有签名的 that 并提供 lambda 表达式。我认为这将比我所拥有的更冗长。ComparablepriceminOf(pair.first, pair.second)minOf()fun <T> minOf(a: T, b: T, comparator: Comparator<in T>): TComparator
0赞 SNM 2/2/2023
是的,没错,非常感谢您@CommonsWare的答案,感谢您抽出时间,我正在寻找已接受的答案中提供的东西
3赞 broot 2/2/2023 #2

您的问题缺少有关数据结构的一些详细信息,以及对象较低意味着什么。但是,如果我正确理解了您的示例,这就是您可以做到这一点的方法:

minOf(pair.first, pair.second, compareBy { it.price }).storeName

或者,我们可以通过转换为列表来更简洁地做到这一点,尽管我认为这可能会产生误导,并且不值得对性能造成影响:

pair.toList().minBy { it.price }.storeName

评论

0赞 SNM 2/2/2023
上下文是一个加密应用程序,我需要从超过 10.000 个结果中知道两个交易所之间某个货币对的最大值,因为这是所有可能交易所的组合,这种方式更容易获得逻辑比使用 if 语句,乍一看也更容易理解