为不可比较列表实现自然顺序比较器
Implement natural order comparator for non-comparable list
我正在为 ArrayList
的克隆实现 List
接口。我正在尝试实施 sort
(source):
我不确定如何实现比较器为空的情况。我的 ArrayList
没有扩展 Comparable
因为我希望能够在列表中存储不可比较的对象。我试过对 sort
方法使用以下内容:
public void sort(Comparator<? super E> c){
if(c == null){
// Use ascending order
class ascComparator<T extends Comparable<? super T>> implements Comparator<T> {
public int compare(T a, T b) {
return a.compareTo(b);
}
}
c = new ascComparator<E>();
}
// Implementation of merge sort goes here
}
这预计会给出一个错误,因为 E
没有扩展 Comparable
。在上面的文档中指出“如果...为空,则此列表中的所有元素都必须实现 Comparable 接口”。如何检查列表中的对象是否实现了 Comparable
,然后如何使用 compareTo
而不会出现错误?有没有更好的方法来做到这一点?
你只需要进行不安全的转换。真的没办法了。
要查看 ArrayList
的作用,请尝试:
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<Object> objects = new ArrayList<>();
objects.add(new Object());
objects.add(new Object());
objects.sort(null);
}
}
您的比较器必须假设列表中的对象是可比较的,这是它能做的最好的事情:
class ascComparator implements Comparator<Object> {
public int compare(Object a, Object b) {
return ((Comparable)a).compareTo(b);
}
}
如果列表中的项目不是 Comparable
,这将抛出 ClasscastException
。
我正在为 ArrayList
的克隆实现 List
接口。我正在尝试实施 sort
(source):
ArrayList
没有扩展 Comparable
因为我希望能够在列表中存储不可比较的对象。我试过对 sort
方法使用以下内容:
public void sort(Comparator<? super E> c){
if(c == null){
// Use ascending order
class ascComparator<T extends Comparable<? super T>> implements Comparator<T> {
public int compare(T a, T b) {
return a.compareTo(b);
}
}
c = new ascComparator<E>();
}
// Implementation of merge sort goes here
}
这预计会给出一个错误,因为 E
没有扩展 Comparable
。在上面的文档中指出“如果...为空,则此列表中的所有元素都必须实现 Comparable 接口”。如何检查列表中的对象是否实现了 Comparable
,然后如何使用 compareTo
而不会出现错误?有没有更好的方法来做到这一点?
你只需要进行不安全的转换。真的没办法了。
要查看 ArrayList
的作用,请尝试:
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<Object> objects = new ArrayList<>();
objects.add(new Object());
objects.add(new Object());
objects.sort(null);
}
}
您的比较器必须假设列表中的对象是可比较的,这是它能做的最好的事情:
class ascComparator implements Comparator<Object> {
public int compare(Object a, Object b) {
return ((Comparable)a).compareTo(b);
}
}
如果列表中的项目不是 Comparable
,这将抛出 ClasscastException
。