English 中文(简体)
Why isn t Collections.binarySearch() working with this comparable?
原标题:

I have this Player class which implements the Comparable interface. Then I have an ArrayList of Players. I m trying to use binarySearch() on the list of Players to find one Player, but Java is giving me a "cannot find symbol: method binarySearch(java.util.ArrayList< Player>,Player)".

This the Player class:

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

Weird thing, when I try Collections.sort() on this same list, it works.

最佳回答

Use are using generics inconsistently. Take heed of the compiler warnings. Always supply generic arguments (or never supply them).

Instead of:

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

Use

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

The rules of generics are difficult enough without the complication of rare types. So, typically the language spec gives up if you mix them up.

问题回答

As long as you are implementing Comparable, you can make compareTo() consistent with equals() by also overriding equals() and hashCode(). This is particularly easy in this case, as you can simply delegate to String. Moreover, it s convenient if you ever need a Map containing instances of Player:

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




相关问题
Spring Properties File

Hi have this j2ee web application developed using spring framework. I have a problem with rendering mnessages in nihongo characters from the properties file. I tried converting the file to ascii using ...

Logging a global ID in multiple components

I have a system which contains multiple applications connected together using JMS and Spring Integration. Messages get sent along a chain of applications. [App A] -> [App B] -> [App C] We set a ...

Java Library Size

If I m given two Java Libraries in Jar format, 1 having no bells and whistles, and the other having lots of them that will mostly go unused.... my question is: How will the larger, mostly unused ...

How to get the Array Class for a given Class in Java?

I have a Class variable that holds a certain type and I need to get a variable that holds the corresponding array class. The best I could come up with is this: Class arrayOfFooClass = java.lang....

SQLite , Derby vs file system

I m working on a Java desktop application that reads and writes from/to different files. I think a better solution would be to replace the file system by a SQLite database. How hard is it to migrate ...

热门标签