问题标签 [comparator]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 如何在 Java 中使用 Comparator 进行排序
我学会了如何使用比较器,但我在使用比较器时遇到了困难。我的代码中有错误:
这是我的代码:
我相信它必须与比较方法中的铸造有关,但我一直在玩它,但仍然找不到解决方案
java - 在 Java 中传递比较器语法帮助
我已经尝试了几种方法,第一种是在以下代码的底部有一个实现比较器的类。当我尝试在 sortListByLastName 中传递比较时,我得到一个未找到构造函数的错误,我不知道为什么
然后当我尝试通过创建一个匿名内部类来做到这一点时,我还得到一个构造函数 TreeMap 找不到符号错误。有什么想法吗?
内部类方法:
java - 关于 null 的 Comparable 和 Comparator 合同
Comparable
合同规定e.compareTo(null)
必须抛出NullPointerException
。
从API:
请注意,
null
它不是任何类的实例,即使返回,也e.compareTo(null)
应该抛出一个。NullPointerException
e.equals(null)
false
另一方面,Comparator
API没有提及比较时需要发生什么null
。考虑以下尝试使用 a 的泛型方法,并为其Comparable
返回 a作为最小元素。Comparator
null
这允许我们执行以下操作:
所以问题是:
- 这是 a 的可接受用法
Comparator
,还是违反了关于比较null
和抛出的不成文规则NullPointerException
的不成文规则? List
甚至必须对包含的元素进行排序是一个好主意null
,还是这是设计错误的明确标志?
java - 在 Java 中,Collections.sort() 线程中使用的 Comparator 是否安全?
如果我创建了 Comparator 的单个实例,是否可以跨多个线程使用该实例来使用 Collections.sort() 对集合进行排序?或者,我是否需要为每次调用 Collections.sort() 创建一个新的 Comparator 实例以确保线程安全?
java - 为什么 Java 集合框架提供两种不同的排序方式?
如果我有一个想要排序的元素列表,Java 提供了两种方法来解决这个问题。
例如,假设我有一个 Movie 对象列表,我想按标题对它们进行排序。
我可以做到这一点的一种方法是调用静态 java.util.Collections.sort( ) 方法的单参数版本,并将我的电影列表作为单个参数。所以我会调用 Collections.sort(myMovieList)。为了使其工作,Movie 类必须声明为实现 java.lang.Comparable 接口,并且必须在该类中实现所需的方法 compareTo()。
另一种排序方法是调用静态 java.util.Collections.sort() 方法的双参数版本,其中电影列表和 java.util.Comparator 对象作为参数。我会调用 Collections.sort(myMovieList, titleComparator)。在这种情况下,Movie 类不会实现 Comparable 接口。相反,在构建和维护电影列表本身的主类中,我将创建一个实现 java.util.Comparator 接口的内部类,并实现一个必需的方法 compare()。然后我会创建这个类的一个实例并调用 sort() 的两个参数版本。第二种方法的好处是您可以创建无限数量的这些内部类比较器,因此您可以以不同的方式对对象列表进行排序。在上面的例子中,
我的问题是,当 Collections.sort() 的双参数版本完成第一个单参数版本所做的所有事情时,为什么还要费心学习 Java 中的两种排序方式,但还有一个额外的好处是能够对列表的元素进行排序基于几个不同的标准?在编码时必须牢记在心的事情会少一件事。您将了解一种在 Java 中排序列表的基本机制。
javascript - Javascript ||,如何比较多个变量的值?
如何正确纠正此语法:
(检查前 3 个变量中的任何一个是否为空或未定义)
java - Java中的直接比较器开箱即用
我有一个方法,它的Comparator
一个参数需要一个。我想传递一个Comparator
进行正常比较的反向比较器和一个反向比较器。
java.util.Collections
提供了一个reverseOrder()
这对反向比较有好处,但我找不到任何正常Comparator
的 .
我想到的唯一解决方案是Collections.reverseOrder(Collections.reverseOrder())
。但我不喜欢它,因为里面调用了双重方法。
当然我可以这样写NormalComparator
:
但我真的很惊讶 Java 没有开箱即用的解决方案。
java - 在Java中插入排序链表
我需要将 Node 类中包含的一些对象插入到排序后的 LinkedList 类中。Node 类看起来像:
其中 card 实现了 Comparator 接口。我正在尝试编写一个函数,在 LinkedList 类(不是 java.util.LinkedList 类,而是我正在编写的链表类)中按卡片值按排序顺序(从低到高)插入这些卡片。有人知道我该怎么做吗?它也不能是双向链表。
java - Java:PriorityQueue 从自定义比较器返回不正确的顺序?
我编写了一个自定义比较器来比较我的节点类,但是 java 优先级队列没有以正确的顺序返回我的项目。
这是我的比较器:
其中 getF 返回一个双精度值。然而,在将几个节点插入优先级队列后,我使用以下命令将它们打印出来:
结果是:
任何想法为什么会这样?我的比较器错了吗?谢谢。
麦克风
java - Java:如何解决缺少 Equatable 接口的问题?
据我所知,诸如SortedMap
or之类的东西在类型上SortedSet
使用compareTo
(而不是equals
)Comparable<?>
来检查相等性(contains
, containsKey
)。
但是,如果某些类型在概念上是相等的,但不可比较怎么办?
(哈希码、内存地址……)
我必须声明一个Comparator<?>
并覆盖方法int compareTo(T o1, To2)
。好的,对于被认为相等的实例,我可以返回 0。但是,对于特殊情况,如果订单不明显,我应该返回什么?
在equatable但(从概念上)不可比较的类型上使用 SortedMap 或 SortedSet 的方法是否很好?
谢谢!
编辑:
我不想存储排序的东西,但我会使用“通常”的 Map 和 Set,我不能“覆盖”平等行为。
编辑 2:
为什么我不能直接覆盖equals(...)
:
我需要改变一个外部类的平等行为。我无法编辑它。
编辑 3:
想想 .NET:他们有 IEquatable 接口,它可以改变相等行为而不触及可比较的行为。
编辑4:
我不能只compareTo
为相等的实例返回0,为不相等的实例返回1吗?有什么大问题?我已经完成了一些测试,似乎 SortedMap/SortedSet 在一对实例上调用了 compareTo 一次。是的,订单没有意义,但为什么会是我的问题呢?我不需要订单。*我只需要改变平等行为。可悲的是,大多数人无法理解这一点。
注意:现在证明不相等实例返回 1 的概念是错误的。
编辑5:改变外国班级
的
平等行为是一个坏概念?当然?我不这么认为:为什么我可以使用 改变外国班级的比较行为?Comparator
编辑 6:
感谢Mark Peters
并感谢waxwing
将密钥类型包装在自定义类中的想法。这样,我可以覆盖 equals 和 hashCode,从而改变相等行为。