collection - tree set en java
¿Cómo es que el TreeSet de Java no tiene un método get()? (9)
El TreeSet
se ordena en el momento de la inserción . Si ordena por las calificaciones de los estudiantes y las modifica después de agregarlas, los elementos ya no se ordenan (el mismo orden que antes).
El TreeSet
tampoco usa equals()
para determinar si un elemento ya está agregado, pero usa el comparador en su lugar (el mismo orden = el mismo elemento). Entonces, si dos estudiantes tienen las mismas calificaciones, solo uno de ellos es agregado. Desde Javadoc :
La instancia de TreeSet realiza todas las comparaciones de elementos utilizando su método compareTo (o compare), por lo que dos elementos que se consideran iguales por este método son, desde el punto de vista del conjunto, iguales.
En lugar de usar TreeSet
, puedes usar un HashSet
y ordenar a los estudiantes por grado cuando los necesites (crear una nueva Lista que contenga a los estudiantes, ordenarlos e iterarlos).
¿Qué sucede si deseo recuperar y actualizar los objetos almacenados en un TreeSet?
La razón por la que pregunto es que quiero poder mantener algunas estructuras de datos que almacenarán a los estudiantes. Quiero que se ordene (por calificaciones, que es una variable de instancia de Student), y debe mantenerse ordenada incluso después de actualizar una (o más) calificación (es) también.
Entonces, después de revisar brevemente las colecciones de Java, decidí irme con TreeSet y establecer un comparador que compare a dos estudiantes por sus calificaciones. El problema es que acabo de descubrir que TreeSet no tiene un método get ().
Cualquier ayuda y sugerencias serían muy apreciadas.
Esta es la respuesta al problema que encontré por mí misma, pero pensé que debería haber un get(elem)
para conjuntos, pero como saben, no hay .
Aqui tienes:
set.subSet(elem,true,elem,true).floor(elem);
Esto te devuelve el primer objeto que es igual al que estás buscando.
NOTA : elem debe ser igual al elemento que está buscando y obtiene el objeto que desea O asignar un comparador al conjunto que los empareja como iguales .
Me sorprendió que a nadie se le ocurriera antes.
Pulgares arriba necesarios: D
Normalmente, no querrá recuperar un elemento en un conjunto cuando ya lo tenga. Podría eliminar su elemento de un conjunto, o saber si pertenece a un conjunto, eso es todo. Saber que quieres hacer es indexar a tus estudiantes por grado, de modo que el índice es el grado, no el objeto en sí. El mapa es la solución.
Si yo fuera usted, usaría la siguiente estructura que recupera rápidamente a todos los estudiantes con el mismo grado (también están clasificados por grados):
private SortedMap<Integer,Set<Student>> _studentsByGrade = new TreeMap<Integer,Set<Student>>();
public void updateStudent(Student student, int oldGrade, int newGrade)
{
getOrCreateContainer(oldGrade).remove(student);
getOrCreateContainer(newGrade).add(student);
student.setGrade(newGrade);
}
public Set<Student> getOrCreateContainer(int grade)
{
Set<Student> set = _studentsByGrade.get(grade);
if(set==null)
{
set = new HashSet<Student>();
_studentsByGrade.put(grade, set);
}
return set;
}
No te olvides de sobrecargar los iguales y hashcode en tu clase de Estudiante para que funcione correctamente.
Es posible que también desee consultar la biblioteca cqengine si desea realizar indexaciones de Java de forma fácil y rápida, pero la solución presentada anteriormente es adecuada para su uso.
Puede recuperar los elementos del conjunto de árboles utilizando un iterador. Puedes probar algo como esto:
Iterator<Integer> it = treeSet.iterator();
Integer current = 0;
while(it.hasNext() ) {
current = it.next();
}
Espero que esto ayude.
Puedes iterar el árbol para recuperar sus objetos. ¿Qué pasa con NavigableSet? Existen métodos para la navegación de corta distancia, como
E ceiling(E e) E floor(E e)
E higher(E e) E lower(E e)
Si contiene el objeto exacto, el piso devolverá el objeto exacto que está buscando.
if(set.contains(searchingObject)) {
addonPartNumber = p.floor(searchingObject);
}
También puede usar para cada uno para obtener todos los elementos dentro de TreeSet
.
TreeSet<String> words = new TreeSet<String>();
for(String w : words) {
System.out.println(w);
}
Puede realizar una iteración para copiar las palabras únicas de TreeSet
en listas, lo que le da el privilegio de usar get();
Esperanza, ayudó.
Tengo un caso en el que utilizo dos TreeSets (porque son más rápidos en las búsquedas). Uno de estos árboles es enorme, y los objetos en los árboles son diferentes, así que creo un objeto simulado (de Tipo 2, segundo árbol) que tiene los campos utilizados para ordenar, usando datos de un objeto del árbol pequeño y verifico si Hay una contraparte en el segundo. Ahora necesito verificar un valor del objeto encontrado en el segundo árbol para agregar valor en un informe.
El uso de un iterador, en lugar de una búsqueda binaria para recuperar el objeto que necesito, anula el propósito de usar un árbol binario. El segundo árbol es de 5 GB más, encontrando coincidencias con datos en el primer árbol (200MB). Necesito una estrategia de búsqueda que tenga sentido para esta enorme cantidad de datos, por lo tanto, elegí un árbol de búsqueda binaria. Las entradas son únicas.
¿Qué esperas que get()
un método get()
en un Set
?
- Los conjuntos no están indexados, por lo que un
get(int index)
no tiene sentido. (Use unaList
si desea obtener elementos por índice). -
get(Object obj)
tampoco tendría sentido, porque ya tendrías el objeto que estás tratando de obtener. - Ya existe un método que
contains()
para verificar si unSet
contiene un objeto. - Puede iterar sobre un
Set
si desea hacer algo con todos los elementos del conjunto.