【问题标题】:Why isn't Collections.binarySearch() working with this comparable?为什么 Collections.binarySearch() 不能与这个可比的?
【发布时间】:2010-12-27 20:08:41
【问题描述】:

我有这个实现Comparable 接口的Player 类。然后我有一个ArrayListPlayers。我正在尝试使用Players 列表中的binarySearch() 来查找Player,但Java 给了我一个“cannot find symbol: method binarySearch(java.util.ArrayList< Player>,Player)”。

这是 Player 类:

class Player implements Comparable {

    private String username;
    private String password;
    Statistics stats;

    //Constructor, creates a new Player with a supplied username
    Player(String name) {
        username = name;
        password = "";
        stats = new Statistics();
    }

    //Accessor method to return the username as a String
    String getName() {
        return username;
    }

    String getPassword() {
        return password;
    }

    void setPassword(String newPass) {
        password = newPass;
    }

    //Method to change the username
    void setName(String newName) {
        username = newName;
    }

    public int compareTo(Object o) {
        return username.compareTo(((Player)o).username);
    }
}

奇怪的是,当我在同一个列表上尝试 Collections.sort() 时,它起作用了。

【问题讨论】:

  • 你能告诉我们调用 Collections.binarySearch 的代码吗?

标签: java generics collections binary-search comparable


【解决方案1】:

使用不一致地使用泛型。注意编译器警告。始终提供通用参数(或从不提供)。

代替:

class Player implements Comparable {
    [...]
    public int compareTo(Object o) {

使用

class Player implements Comparable<Player> {
    [...]
    public int compareTo(Player o) {

没有稀有类型的复杂性,泛型的规则就足够难了。因此,如果您将它们混合在一起,通常语言规范会放弃。

【讨论】:

  • 哇,这解决了问题。谢谢。我一定错过了文档中的那部分。
【解决方案2】:

只要您正在实现Comparable,您就可以通过覆盖equals()hashCode() 使compareTo()equals() 一致。在这种情况下,这特别容易,因为您可以简单地委托给String。此外,如果您需要包含 Player 实例的 Map,这很方便:

class Player implements Comparable<String> {

    private String username;
    private String password;

    // ...

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

    @Override
    public boolean equals(Object obj) {
        return obj instanceof Player
            && username.equals(((Player)obj).username);
    }

    @Override
    public int hashCode() {
        return username.hashCode();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 2022-08-09
    • 2011-06-05
    • 2012-05-05
    • 2011-02-11
    • 1970-01-01
    相关资源
    最近更新 更多