我正在尝试创建一个类,该类可以与同一类的实例进行比较,也可以与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);
}
}
但是,当然,您不能用不同的参数多次实现同一个接口。
因此,我正在寻找一种方法来完成上述工作。我看过以下以前的答案,但没有找到一个真正充分回答这个问题的答案。至少,如果它真的发生了,我不明白
- compareTo和使用扫描程序的字符串
- 在Java中根据不同的数据成员对对象列表进行排序
- 其他一些我现在没有链接的人
基本上,我想做的是:
public int compare(Record r, String s) {
return r.name.compareTo(s);
}
不过,据我所知,如果不实现某种公共接口或超类,就无法比较不同类型的对象。对于String
,我真的没有这个选择。
如果可能的话,有人能告诉我怎么做吗?谢谢
更新我意识到我可以做以下事情:
Collections.binarySearch(records, new Record("3"));
但是,这不是我想要的。谢谢
您可以在不使用类型限定Comparable的情况下实现Comparable,并使用instanceof检查传入的Object,并根据收到的类型采取不同的行为。
您不能这样做。来自javadoc
从compare的契约中可以直接得出商是C上的等价关系并且String的compareTo对于您的Record永远不会返回true。
您可以做的是创建Comparator来比较Strings和Records。不要使用泛型。
您可以尝试下一个方法来获取排序集合中的索引:
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
}
定义接口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);
}