Java可与实例或字符串相比较



我正在尝试创建一个类,该类可以与同一类的实例进行比较,也可以与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);
    }

最新更新