64 votes

Pourquoi java.util.HashSet n'a-t-il pas de méthode get (Object o)?

J'ai vu d'autres questions au sujet d'obtenir des objets de Jeu est basé sur la valeur de l'indice et je comprends pourquoi ce n'est pas possible. Mais je n'ai pas été en mesure de trouver une bonne explication pour pourquoi un objet n'est pas autorisé donc pensé que je pourrais demander.

HashSet est soutenu par une table de hachage afin d'obtenir un objet à partir, il devrait être assez simple. Comme il est maintenant, il semble que j'aurais pour itérer sur chaque élément de la HashSet et de test pour l'égalité, qui semble inutile.

Je pouvais HashMap mais je n'ai pas besoin d'une clé:valeur paire, j'ai juste besoin d'un Ensemble.

Par Exemple dire que j'ai Foo.java:

package example;

import java.io.Serializable;

public class Foo implements Serializable {

    String _id;
    String _description;

    public Foo(String id){
        this._id = id
    }

    public void setDescription(String description){
        this._description = description;
    }

    public String getDescription(){
        return this._description;
    }

    public boolean equals(Object obj) {
        //equals code, checks if id's are equal
    }

    public int hashCode() {
        //hash code calculation
    }

}

et Example.java:

package example;

import java.util.HashSet;

public class Example {

    public static void main(String[] args){
        HashSet<Foo> set = new HashSet<Foo>();

        Foo foo1 = new Foo("1");
        foo1.setDescription("Number 1");

        set.add(foo1);
        set.add(new Foo("2"));

        //I want to get the object stored in the Set, so I construct a object that is 'equal' to the one I want.
        Foo theFoo = set.get(new Foo("1")); //Is there a reason this is not allowed?
        System.out.println(theFoo.getDescription); //Should print Number 1
    }

}

Est-ce parce que la méthode equals est destiné à tester pour "absolue" de l'égalité plutôt que la "logique" de l'égalité (dans ce cas, contains(Object o) serait suffisante)?

52voto

Java Carte/Collection Feuille De Triche

Il contient une paire clé/valeur ou de valeurs uniquement?

1) Si elle contient des paires, le choix est une carte. C'est l'ordre important?

. 1-1) Si oui, suivez l'ordre d'insertion ou de tri par des touches?

. . 1-1-1) Si commandé, LinkedHashMap

. . 1-1-2) Si triés, TreeMap

. 1-2) Si non, HashMap

2) Si il ne stocke que les valeurs, le choix est une collection. Il va contenir des doublons?

. 2-1) Si oui, ArrayList

. 2-2) Si non, est la tâche principale de la recherche pour les éléments (contient/supprimer)?

. . 2-2-1) Si non, ArrayList

. . 2-2-2) Si oui, est de l'ordre important?

. . . 2-2-2-1) Si non, HashSet

. . . 2-2-2-2) Si oui, suivez l'ordre d'insertion ou de tri par les valeurs?

. . . . 2-2-2-2-1) si commandé, LinkedHashSet

. . . . 2-2-2-2-2) si triés, TreeSet

31voto

Peter Lawrey Points 229686

Un ensemble est une collection d'objets égaux, donc il n'est pas logique d'essayer d'obtenir le même objet que vous avez déjà.

Si vous essayez d'obtenir(Objet) à partir d'une collection, une Carte est susceptible d'être plus approprié.

Ce que vous devriez écrire est

Map<String, String> map = new LinkedHashMap<>();

map.put("1", "Number 1");
map.put("2", null);
String description = set.get("1");

si un objet n'est pas dans le jeu (basé sur des égaux), ajouter, si il est dans le jeu (basé sur des égaux) donnez-moi le jeu de l'instance de l'objet

Dans le cas improbable où vous avez besoin de cela, vous pouvez utiliser une Carte.

Map<Bar, Bar> map = // LinkedHashMap or ConcurrentHashMap

Bar bar1 = new Bar(1);
map.put(bar1, bar1);

Bar bar1a = map.get(new Bar(1));

5voto

X.L.Ant Points 8563

Votre dernière phrase est la réponse.

get(Object o) parcourraient les HashSet recherche d'un autre objet égal à o (en utilisant la méthode equals(o) ). Donc, en fait, c'est la même chose que contains(o) , qui fait la même chose, mais ne renvoie pas le même résultat.

5voto

Yogendra Singh Points 19406

Si vous voulez savoir que l'objet new Foo("1"); est déjà présent dans la méthode set vous devez utiliser la méthode contains comme:

 boolean present =  set.contains(new Foo("1"));
 

Le get type de méthode c. -à- set.get(new Foo("1")); est pas pris en charge parce qu'il n'a pas de sens. Vous avez déjà l'objet, c'est-à-dire new Foo("1") puis quelles informations supplémentaires recherchez-vous grâce à la méthode get .

0voto

user07 Points 1

HashSet est un peu plus simple que HashMap. Si vous n'avez pas besoin des fonctionnalités de HashMap, pourquoi l'utiliser? Si la méthode comme getObject (ObjectType o) a été implémentée par Java, nous n'avons pas besoin de parcourir le jeu après l'appel de la méthode contain () ...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X