有什么方法可以在具有对象的ArrayList中实现二进制搜索?在此示例中,ArrayList将使用字段“ 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);
如果我应该使用二进制搜索返回具有指定ID的用户,“ User getUserById(ArrayList users,int userid)”将如何?这有可能吗?
Java教程的对象排序文章中有一个示例,您可以编写自己的示例Comparator以对自定义类型进行比较。
Comparator
然后,ArrayList(或任何其他List),要查找的键以及Comparator可以一起传递到Collections.binarySearch方法中。
ArrayList
List
Collections.binarySearch
这是一个例子:
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); } }