Pourquoi la méthode TreeSet de Java n'a pas de get ()?
et si je veux récupérer et mettre à jour des objets stockés dans un arbre?
la raison pour laquelle je demande, est que je veux être en mesure de maintenir une certaine structure de données qui va stocker les étudiants. Je veux qu'il soit trié (par niveaux - qui est une variable d'instance de L'étudiant), et - il doit être maintenu trié même après que je mette à jour une (ou plusieurs) Classe(S) aussi bien.
donc, après avoir brièvement regardé les collections de Java, j'ai décidé D'aller avec TreeSet et de mettre un comparateur qui compare deux élèves par leurs notes. le problème est que je viens de découvrir que TreeSet n'a pas de méthode get ()!
toute aide et suggestion serait grandement appréciée.
9 réponses
Qu'attendez-vous d'un get()
méthode sur un Set
faire?
- les ensembles ne sont pas indexés, donc un
get(int index)
n'a pas de sens. (Utiliser unList
si vous voulez obtenir des éléments par index). get(Object obj)
ne permettrait pas de sens, parce que vous en auriez l'objet que vous essayez d'obtenir déjà.- Il y a déjà un
contains()
méthode pour vérifier si unSet
contient un objet. - vous pouvez itérer sur un
Set
si vous voulez faire quelque chose avec tous les éléments de l'ensemble.
Vous pouvez récupérer les éléments de l'arbre en utilisant un itérateur. Vous pouvez essayer quelque chose comme ceci:
Iterator<Integer> it = treeSet.iterator();
Integer current = 0;
while(it.hasNext() ) {
current = it.next();
}
Espérons que cette aide.
j'ai un cas où j'utilise deux arbres (parce qu'ils sont plus rapides dans les recherches). Un de ces arbres est énorme, et les objets dans les arbres sont différents, donc je crée un objet simulé (de Type 2, deuxième arbre) qui a les champs utilisés pour trier, en utilisant les données d'un objet à partir du petit arbre et de vérifier s'il y a une contrepartie sur la seconde. Maintenant je dois vérifier une valeur de l'objet trouvé dans le deuxième arbre pour ajouter de la valeur sur un rapport.
en utilisant un itérateur, au lieu d'un binaire recherche pour récupérer l'objet dont j'ai besoin, défaites le but de l'utilisation d'un arbre binaire. Le deuxième arbre est 5 Go plus, trouver des appariements avec les données dans le premier arbre (200 Mo). J'ai besoin d'une stratégie de recherche qui fait sens pour cette énorme quantité de données, donc j'ai choisi un arbre de Recherche Binaire. Les entrées sont uniques.
Habituellement, vous ne voulez récupérer un élément dans un ensemble lorsque vous l'avez déjà. Vous pouvez retirer votre élément d'un ensemble, ou de savoir si elle appartient à un ensemble, c'est tout. Sachez que vous voulez faire est d'indexer vos élèves par niveau, donc l'index est la classe, pas l'objet lui-même. La carte est la solution.
si j'étais vous, j'utiliserais la structure suivante qui récupère tous les étudiants avec le même grade rapidement (ils sont triés par grades trop) :
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;
}
n'oubliez pas de surcharger les égaux et le hashcode dans votre classe D'étudiant pour qu'il fonctionne correctement.
vous pourriez aussi vouloir vérifier la bibliothèque cqengine si vous voulez effectuer des indexations java facilement et rapidement, mais la solution présentée ci-dessus est juste ok pour votre usage.
Vous pouvez parcourir l'arbre pour récupérer ses objets. Qu'en est NavigableSet? il existe des méthodes pour la navigation à courte distance, comme
E ceiling(E e) E floor(E e)
E higher(E e) E lower(E e)
TreeSet
tried upon insertion. Si vous commandez par les notes des étudiants et les modifier après ajoutée, les articles ne sont plus triés (même ordre qu'avant).
TreeSet
n'utilise pas non plus equals()
pour déterminer si un élément est déjà ajouté, mais utilise le comparateur de place (même ordre = même élément). Donc, si deux élèves ont le même niveau, un seul d'entre eux est ajouté. À partir de Javadoc:
TreeSet instance effectue toutes les comparaisons d'éléments en utilisant son compareTo (ou comparer) méthode, donc deux éléments qui sont jugés égaux par ce méthode sont, du point de vue de l'ensemble, égaux.
au Lieu d'utiliser TreeSet
, vous pouvez utiliser un HashSet
et classez les élèves par niveau chaque fois que vous en avez besoin (créez une nouvelle liste contenant les étudiants, triez-la et itérez-la).
S'il contient l'objet exact le sol retournera l'objet exact que vous recherchez.
if(set.contains(searchingObject)) {
addonPartNumber = p.floor(searchingObject);
}
Vous pouvez également l'utiliser pour chacun d'obtenir tous les éléments à l'intérieur de TreeSet
.
TreeSet<String> words = new TreeSet<String>();
for(String w : words) {
System.out.println(w);
}
vous pouvez effectuer une itération pour copier les mots uniques de TreeSet
dans les Listes, ce qui vous donne le privilège d'utiliser get();
j'Espère, il a aidé.
C'est la réponse au problème que j'ai trouvé moi-même mais j'ai pensé qu'il devrait y avoir un get(elem)
pour les jeux, mais comme vous le savez, il n'y a pas.
Ici, vous allez:
set.subSet(elem,true,elem,true).floor(elem);
Cela vous donne le premier objet qui est égal à celui que vous recherchez.
NOTE: elem doit être égale à l'élément que vous recherchez et vous obtenez l'objet que vous voulez OR assigner un comparateur pour le jeu qui correspond comme égale.
j'ai été surpris que personne ne l'ait trouvé avant.
Thumbs up neededed: D