web-dev-qa-db-fra.com

Implémenter une recherche binaire dans des objets

Y a-t-il un moyen de mettre en œuvre une recherche binaire dans une arrayliste avec des objets? Dans cet exemple, la arracheliste sera triée avec le champ 'ID'.

class User{
 public int id;
 public string name;
}

ArrayList<User> users = new ArrayList<User>();

sortById(users);

int id = 66
User searchuser = getUserById(users,id);

Comment l'on dirait que "l'utilisateur getuserbyid (utilisateurs ArrayList, userid)" "ressemblerait à si je dois renvoyer l'utilisateur avec un identifiant spécifié à l'aide de la recherche binaire? Est-ce seulement possible?

21
Baversjo

L'article OBJECT commande article du Java Didacticiels a un exemple d'écriture de votre propre Comparator afin d'effectuer des comparaisons sur types personnalisés.

Ensuite, le ArrayList (ou tout autre List), la clé à trouver, ainsi que Comparator peut être transmis dans le Collections.binarySearch méthode.

Voici un exemple:

import Java.util.*;

class BinarySearchWithComparator
{
  public static void main(String[] args)
  {
    // Please scroll down to see 'User' class implementation.
    List<User> l = new ArrayList<User>();
    l.add(new User(10, "A"));
    l.add(new User(20, "B"));
    l.add(new User(30, "C"));

    Comparator<User> c = new Comparator<User>() {
      public int compare(User u1, User u2) {
        return u1.getId().compareTo(u2.getId());
      }
    };

    // Must pass in an object of type 'User' as the key.
    // The key is an 'User' with the 'id' which is been searched for.
    // The 'name' field is not used in the comparison for the binary search,
    // so it can be a dummy value -- here it is omitted with a null.
    //
    // Also note that the List must be sorted before running binarySearch,
    // in this case, the list is already sorted.

    int index = Collections.binarySearch(l, new User(20, null), c);
    System.out.println(index);    // Output: 1

    index = Collections.binarySearch(l, new User(10, null), c);
    System.out.println(index);    // Output: 0

    index = Collections.binarySearch(l, new User(42, null), c);
    System.out.println(index);    // Output: -4
                                  // See javadoc for meaning of return value.
  }
}

class User {
  private int id;
  private String name;

  public User(int id, String name) {
    this.id = id;
    this.name = name;
  }

  public Integer getId() {
    return Integer.valueOf(id);
  }
}
50
coobird

Utilisation Collections.binarySearch avec un Comparator.

6

Vous pouvez également mettre le comparateur dans la classe d'utilisateurs:

public class User implements Comparable<User>, Comparator<User>
{
  public User(int id, String name)
  {
    this.id = id;
    this.name = name;
  }
  @Override
  public int compareTo(User u)
  {
    return id - u.getID();
  }
  @Override
  public int compare(User u1, User u2)
  {
    return u1.getID() - u2.getID();
  }

  public int getID() { return id; }
  public String getName() { return name; }
  private int id;
  private String name;
}

Ensuite, vous procédez comme suit à une arraylist appelée Utilisateurs:

ArrayList<User> users = new ArrayList<User>();
users.add(new User(3, "Fred"));
users.add(new User(42, "Joe"));
users.add(new User(5, "Mary"));
users.add(new User(17, "Alice"));

Collections.sort(users);
int index = Collections.binarySearch(users, new User(5, null));
if(index >= 0)
  System.out.println("The user name of id 5 is: "+users.get(index).getName());
else
  System.out.println("ID 5 is not in the list");
6
rpw
import Java.util.Collections;
Collections.binarySearch(users, id);
3
grepsedawk

Vous devez utiliser la méthode BinarySearch uniquement sur la châtryliste triée. Donc, triez d'abord l'arlamon et utilisez la même référence de comparaison (que vous avez utilisée pour effectuer le tri) pour effectuer l'opération BinarySearch.

1
Sudipta Deb