recursiva pseint complejidad busqueda binaria java search collections binary-search

java - complejidad - busqueda binaria pseint



Implementar búsqueda binaria en objetos. (5)

Debería usar el método binarySearch solo en el ArrayList ordenado. así que primero ordene ArraList y use la misma referencia de comparación (que solía hacer la ordenación) para realizar la operación de búsqueda binaria.

¿Hay alguna forma de implementar la búsqueda binaria en un ArrayList con objetos? En este ejemplo, ArrayList se ordenará con el campo ''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);

¿Cómo se vería el "Usuario getUserById (usuarios de ArrayList, int userid)" si debo devolver al usuario con un ID específico utilizando la búsqueda binaria? ¿Es esto posible?


El artículo de The Object Ordering de The Java Tutorials tiene un ejemplo de cómo escribir su propio Comparator para realizar comparaciones en tipos personalizados.

Luego, la ArrayList (o cualquier otra List ), la clave a buscar, junto con Comparator se puede pasar al método Collections.binarySearch .

Aquí hay un ejemplo:

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


También puedes poner el comparador en la clase de Usuario:

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

Entonces harías lo siguiente a un ArrayList llamado usuarios:

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


Utilice Collections.binarySearch con un Comparator .


import java.util.Collections; Collections.binarySearch(users, id);