implementations java set

implementations - Cómo obtener el índice de un elemento en java.util.Set



sortedset java (4)

¿Qué hay de agregar las cadenas a una tabla hash donde el valor es un índice?

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");

Conozco las diferencias entre Conjunto y Lista (se permiten duplicaciones únicas vs. no ordenadas / ordenadas, etc.). Lo que busco es un conjunto que mantenga los elementos ordenados (eso es fácil), pero también necesito poder recuperar el índice en el que se insertó un elemento. Entonces, si inserto cuatro elementos, quiero saber el orden en que se insertó uno de ellos.

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

Entonces, en cualquier momento, puedo verificar si ya se agregó una Cadena y obtener el índice de la cadena en el conjunto. ¿Hay algo como esto, o necesito implementarlo yo mismo?


Después de crear el juego, simplemente conviértalo a la lista y obtenga por índice de la lista:

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";


Un pequeño método personalizado estático en una clase de Util ayudaría:

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 necesita / quiere una clase que sea ​​un Set y ofrezca un método getIndex() , le sugiero que implemente un nuevo Set y use el patrón decorador:

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; } }


puede extender LinkedHashSet agregando el getIndex() deseado getIndex() . Son 15 minutos para implementarlo y probarlo. Simplemente pase por el conjunto utilizando iterador y contador, verifique la igualdad del objeto. Si lo encuentra, devuelva el contador.