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?
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;
}
}
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";
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.
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");