2

我正在尝试创建一个可以与同一类的实例进行比较的类,或者与String.

例如,考虑以下情况:

public class Record implements Comparable<Record> {
    public String name;

    public Record(String name) {
        this.name = name;
    }

    public int compareTo(Record o) {
        return name.compareTo(o.name);
    }
}

然后我将其放入ArrayList如下:

ArrayList<Record> records = new ArrayList<Record>();
records.add(new Record("3"));
records.add(new Record("1"));
records.add(new Record("2"));

如果我然后对它们进行排序,它们就会正确排序:

Collections.sort(records);

但是,我不希望能够通过基于字符串的二进制搜索来获取记录。例如:

int index = Collections.binarySearch(records, "3");

问题是没有compareTo将 String 作为参数的方法,我不确定如何实现它。

我试着做:

public class Record implements Comparable<Record>, Comparable<String> {
    public String name;

    public Record(String name) {
        this.name = name;
    }

    public int compareTo(Record o) {
        return name.compareTo(o.name);
    }

    public int compareTo(String o) {
        return name.compareTo(o);
    }
}

但是,当然,您不能多次使用不同的参数实现同一个接口。

所以,我正在寻找一种方法来完成上述工作。我已经查看了以下先前的答案,但还没有找到一个真正充分回答这个问题的答案。至少,如果是这样,我不明白。

基本上,我想做的是以下几点:

public int compare(Record r, String s) {
    return r.name.compareTo(s);
}

不过,据我所知,如果不实现某种通用接口或超类,就无法比较不同类型的对象。我真的没有那个选项String

如果可能的话,有人可以告诉我如何做到这一点吗?谢谢。

更新 我意识到我可以执行以下操作:

Collections.binarySearch(records, new Record("3"));

但是,这不是我所追求的。谢谢。

4

4 回答 4

4

您可以在不使用类型限定的情况下实现 Comparable,并使用 instanceof 检查传入的对象,并根据您收到的类型采取不同的行为。

于 2013-02-25T19:42:20.240 回答
1

你不能这样做。来自 javadoc

从 compareTo 的合同中可以看出,商是 C 上的等价关系,并且 String 的 compareTo 永远不会为您的 Record 返回 true。

您可以做的是创建比较字符串和记录的比较器。不用泛型就可以了。

于 2013-02-25T19:47:25.580 回答
1

您可以尝试下一个获取排序集合中的索引:

class Record implements Comparable<String> {

    public String name;

    public Record(String name) {
        this.name = name;
    }

    @Override
    public int compareTo(String o) {
        return name.compareTo(o);
    }

}

和:

public static void main(String[] args) {

    ArrayList<Record> records = new ArrayList<Record>();
    records.add(new Record("3"));
    records.add(new Record("1"));
    records.add(new Record("2"));

    Collections.sort(records, new Comparator<Record>() {
        @Override
        public int compare(Record a, Record b) {
            return a.name.compareTo(b.name);
        }
    });

    int index = Collections.binarySearch(records, "3");
    System.out.println(index); // 2

}
于 2013-02-25T19:59:26.380 回答
0

定义接口 ComparableToString 并实现它有问题吗?它的 compareTo 方法可以将调用者限制为 String。没有instanceof,不需要强制转换。

    public class Record implements Comparable<Record>, ComparableToString
    {
        public String name;

        public Record(String name)
        {
            this.name = name;
        }

        public int compareTo(Record o)
        {
            return name.compareTo(o.name);
        }

        public int compareTo(String o)
        {
            return name.compareTo(o);
        }
    }
    interface ComparableToString
    {
        public int compareTo(String s);
    }
于 2013-02-25T19:47:08.333 回答