为不可比较列表实现自然顺序比较器

发布于 2025-01-10 00:30:12 字数 1109 浏览 0 评论 0原文

我正在为 ArrayList 的克隆实现 List 接口。我正在尝试实现 sort (来源): java. util.List排序方法我不确定如何实现比较器为空的情况。我的 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。在上面的文档中,指出“如果...为 null,则此列表中的所有元素都必须实现 Comparable 接口”。如何检查列表中的对象是否实现了 Comparable 以及如何使用 compareTo 而不会出现错误?有没有更好的方法来做到这一点?

I'm implementing the List interface for a clone of ArrayList. I'm trying to implement sort (source):
java.util.List sort method
I'm not sure how to implement the case where the comparator is null. My ArrayList does not extend Comparable because I want to be able to store non-comparable objects in the list. I've tried using the following for the sort method:

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
}

This expectedly gives an error as E does not extend Comparable. In the above documentation it is stated "if ... is null then all elements in this list must implement the Comparable interface". How do I check that the objects in the list implement Comparable and how do I then use compareTo without getting an error? Is there just a better way to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

北城挽邺 2025-01-17 00:30:12

要了解 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);
            }
        }

如果您列表中的项目不具有可比性

To see what ArrayList does, try:

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);
    }
}

Your comparator must just assume that the objects in the list are Comparable, that's the best it can do:

 class ascComparator implements Comparator<Object> {
            public int compare(Object a, Object b) {
                return ((Comparable)a).compareTo(b);
            }
        }

Which will throw a ClasscastException if the items in your list are not Comparable.

左秋 2025-01-17 00:30:12

你只需要进行不安全的转换。确实没有办法解决这个问题。

You just have to do the unsafe cast. There's really no way around it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文