web-dev-qa-db-fra.com

Comment obtenir l'index d'un élément dans Java.util.Set

Je connais les différences entre Set et List (uniques par rapport aux duplications autorisées, non commandées/commandées, etc.). Ce que je recherche, c’est un ensemble qui garde les éléments ordonnés (c’est facile), mais je dois aussi pouvoir récupérer l’index dans lequel un élément a été inséré. Donc, si j'insère quatre éléments, je veux pouvoir connaître l'ordre dans lequel l'un d'eux a été inséré.

MySet<String> set = MySet<String>();
set.add("one");
set.add("two");
set.add("three");
set.add("four");

int index = set.getIndex("two");

Ainsi, à tout moment, je peux vérifier si une chaîne a déjà été ajoutée et obtenir l'index de la chaîne dans l'ensemble. Y a-t-il quelque chose comme ça, ou dois-je le mettre en œuvre moi-même?

23

Une petite méthode personnalisée statique dans une classe Util aiderait:

 public static int getIndex(Set<? extends Object> set, Object value) {
   int result = 0;
   for (Object entry:set) {
     if (entry.equals(value)) return result;
     result++;
   }
   return -1;
 }

Si vous avez besoin/souhaitez une classe qui est un Set et offre une méthode getIndex(), je vous suggère fortement de mettre en œuvre une nouvelle Set et d'utiliser le modèle de décorateur:

 public class IndexAwareSet<T> implements Set {
   private Set<T> set;
   public IndexAwareSet(Set<T> set) {
     this.set = set;
   }

   // ... implement all methods from Set and delegate to the internal Set

   public int getIndex(T entry) {
     int result = 0;
     for (T entry:set) {
       if (entry.equals(value)) return result;
       result++;
     }
     return -1;
   }
 }
11
Andreas_D

Après avoir créé Set, convertissez-le simplement en List et obtenez l’index de List:

Set<String> stringsSet = new HashSet<>();
stringsSet.add("string1");
stringsSet.add("string2");

List<String> stringsList = new ArrayList<>(stringsSet);
stringsList.get(0); // "string1";
stringsList.get(1); // "string2";
19
Kiryl Ivanou

vous pouvez étendre LinkedHashSet en ajoutant votre méthode getIndex() souhaitée. Il faut 15 minutes pour l'implémenter et le tester. Il suffit de parcourir l'ensemble à l'aide d'un itérateur et d'un compteur, puis de vérifier l'égalité d'objet. Si trouvé, retournez le compteur.

3
Vladimir Ivanov

Pourquoi ne pas ajouter les chaînes à une table de hachage où la valeur est un index:

  Hashtable<String, Integer> itemIndex = new Hashtable<>();
  itemIndex.put("First String",1);
  itemIndex.put("Second String",2);
  itemIndex.put("Third String",3);

  int indexOfThirdString = itemIndex.get("Third String");
0
abinkleysf