java - 如何创建比较器

标签 java generics comparator

假设我有泛型类

public class MyClass<T extends Comparable<T>> {
    T a;

    MyClass(T x) {
        a = x;
    }

    public String toString() {
        return a.toString();
    }
}

我想让 Comparator 能够对充满 MyClass 元素的集合进行排序。

如果我这样写

public class MyComparator implements Comparator<MyClass> {
    public int compare(MyClass o1, MyClass o2) {
        return o1.a.compareTo(o2.a);
    }
}

我收到警告未经检查的调用...

像这样编写比较器是否正确

import java.util.Comparator;

public class MyComparator<T extends Comparable<T>> implements Comparator<MyClass<T>> {
    public int compare(MyClass<T> o1, MyClass<T> o2) {
        return o1.a.compareTo(o2.a);
    }
}

最佳答案

如果您希望 MyClassComparable,这样您就可以在不传入 Comparator 的情况下进行排序,这可以通过以下方式完成:

public class MyClass<T extends Comparable<T>> implements
        Comparable<MyClass<T>> {
    T a;

    MyClass(T x) {
        a = x;
    }

    public String toString() {
        if (a == null) return "null";
        return a.toString();
    }

    @Override
    public int compareTo(MyClass<T> o) {
        if (this.a == null) {
            if (o == null || o.a == null) return 0;
            return -1;
        } else if (o == null || o.a == null) return 1;
        return this.a.compareTo(o.a);
    }
}

如果您确实想创建一个 MyClassComparator 那么它应该看起来像,

public class MyClass<T extends Comparable<T>> {
    T a;

    MyClass(T x) {
        a = x;
    }

    public String toString() {
        if (a == null) return "null";
        return a.toString();
    }
}

public class MyClassComparator<T extends Comparable<T>> implements
        Comparator<MyClass<T>> {
    @Override
    public int compare(MyClass<T> left, MyClass<T> right) {
        if (left == null) {
            if (right == null) {
                return 0;
            }
            return -1;
        } else if (right == null) {
            return 1;
        }
        if (left.a == null) {
            if (right.a == null) {
                return 0;
            }
            return -1;
        } else if (right.a == null) {
            return 1;
        }
        return left.a.compareTo(right.a);
    }
}

关于java - 如何创建比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26897027/

相关文章:

java - 在简单工厂中使用泛型时如何解决这个困境

java - 链接列表中的比较器

java - 比较方法在排序文件时违反了它的一般契约

java - 使用 javapns 作为推送通知提供者/服务器

java - Authorize.net Java SDK(2.0.1v) 环境未设置问题

java - 代表CFG制作

Java 嵌入式比较器类

java - 断路器模式

java - 接受两种类型之一的泛型类

java - 为什么泛型中未指定的类型会破坏非泛型方法的类型安全