L'article Object Ordering de Java Tutoriels a un exemple d'écrire votre propre Comparator
afin d'effectuer des comparaisons sur les types personnalisés.
Ensuite, le ArrayList
(ou tout autre List
), la clé pour trouver, avec Comparator
peut être passé dans la méthode Collections.binarySearch
.
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);
}
}
Cela ne fonctionnera pas sur le code tel qu'il est écrit , pour deux raisons: 1) L'utilisateur n'implémente pas Comparable, et aucun comparateur n'est donné. 2) Vous devez transmettre à binarySearch un objet réel du type stocké dans la liste; vous passez un int à la place. –