Java可与实例或字符串进行比较

时间:2013-02-25 19:38:58

标签: java arraylist compare comparable compareto

我正在尝试创建一个可以与同一个类的实例进行比较的类,或者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 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

你做不到。 来自javadoc

  

它直接来自compareTo的合同,即商是C上的等价关系   和String的compareTo将永远不会为您的记录返回true。

你可以做的是创建比较字符串和记录的比较器。只要不带泛型就可以了。

答案 2 :(得分: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

}

答案 3 :(得分:0)

定义ComparableToString接口并实现它有什么问题吗?它的compareTo方法可以将调用者限制为String。没有例子,不需要铸造。

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