ordering funciona como java search treeset

ordering - treeset java como funciona



Buscando un registro en un TreeSet sobre la marcha (2)

Estoy escribiendo una aplicación de libro de contactos en Java utilizando las bibliotecas swing y awt. La aplicación consiste en una JList que usa un TreeSet como un abstractListModel.

TreeSet es para una clase llamada Contact, que tiene una clase privada de comparación que ordena los contactos según su primer nombre. el método private boolean equals(Object o) devuelve true si el contacto tiene el mismo mobileNumber que el de O (después del casting, por supuesto).

Quiero agregar una funcionalidad de búsqueda en esta aplicación. Hice una búsqueda en JTextField y agregué un keyListener y lo que quiero hacer es que después de presionar cada tecla, la lista muestre un conjunto de resultados que contenga los términos de búsqueda. ¿Hay algún método para esto en TreeSet o en cualquier otra colección? Quiero que sea similar a lo que tienes en la aplicación de música en iPods, donde cuando escribes la letra ''f'', por ejemplo, enumera todas las canciones que contienen la letra F, pero solo cuando escribes ''cincuenta centavos'' que aparezcan las canciones del cantante que quieres.

Gracias por tu ayuda.


Puede usar el boolean startsWith(String prefix) de la clase java.lang.String para verificar si los valores en el conjunto comienzan con la cadena de entrada.

Ej .:

public void getName(Set<String> t, String s) { for(String str : t) { if(str.toLowerCase().startsWith(s.toLowerCase())) System.out.println(str); } }

entrada:

Set<String> test = new TreeSet<String>(); test.add( "Erich" ); test.add( "Erica" ); test.add( "Erin" ); test.add( "Dave" ); test.add( "Thomas" );

si llamas al método:

getName(test, "eri");

salida será:

Erica Erich Erin


Si quiere encontrar todas las entradas que comienzan con el texto (por ejemplo, "f"), puede usar el subSet(from, to) , como este:

SortedSet<String> s = new TreeSet<String>(new Comparator<String>() { public int compare( String s1, String s2 ) { return s1.compareToIgnoreCase( s2 ); } }); s.add( "Erich" ); s.add( "Erica" ); s.add( "Erin" ); s.add( "Dave" ); s.add( "Thomas" ); SortedSet<String> result = s.subSet( "e", "e" + Character.MAX_VALUE ); //"e" represents the user input System.out.println(result);//prints [Erica, Erich, Erin] result = s.subSet( "Eric", "Eric" + Character.MAX_VALUE ); System.out.println(result); //prints [Erica, Erich] result = s.subSet( "Erich", "Erich" + Character.MAX_VALUE ); System.out.println(result); //prints [Erich]

Como el parámetro to del subset(from, to) es exclusivo, necesita algo que claramente será mayor. En mi ejemplo, simplemente agregué Character.MAX_VALUE pero es posible que desee obtener un límite superior mejor. Tenga en cuenta que esto depende de su comparador, por ejemplo, cómo maneja las diferencias de caso, etc.

Si desea filtrar utilizando comodines, como todos los textos que contienen el texto (por ejemplo, f se traduciría a *f* ), tendría que repetir iteraciones y verificar todas las entradas de todos modos. En ese caso, no obtiene ninguna ventaja con un conjunto ordenado.

Editar: actualizó el ejemplo a sus datos (agregándome también :)).