我正在尝试创建一个可以与同一个类的实例进行比较的类,或者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"));
但是,这不是我追求的目标。感谢。
答案 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);
}