Almacene una matriz asociativa de cadenas con longitud como claves

Tengo esta entrada:

5
it
your
reality
real
our

La primera línea es el número de cadenas que vienen después. Y debería almacenarlo de esta manera (pseudocódigo):

associative_array = [ 2 => ['it'], 3 => ['our'], 4 => ['real', 'your'], 7 => ['reality']]

Como puede ver, las claves de la matriz asociativa son la longitud de las cadenas almacenadas en la matriz interna. Entonces, ¿cómo puedo hacer esto en Java? Vengo de php world, así que si lo comparas con php, estará muy bien.

Respuesta 1

Java no tiene matrices asociativas. Pero sí tiene Hashmaps, que en su mayoría logra el mismo objetivo. En su caso, puede tener múltiples valores para cualquier clave dada. Entonces, lo que podría hacer es hacer que cada entrada en el Hashmap sea una matriz o una colección de algún tipo. ArrayList es una opción probable. Es decir:

Hashmap<Integer,ArrayList<String>> words=new HashMap<Integer,ArrayList<String>>();

No voy a revisar el código para leer su lista de un archivo o lo que sea, esa es una pregunta diferente. Pero solo para darle una idea de cómo funcionaría la estructura, supongamos que podríamos codificar la lista. Podríamos hacer algo como esto:

ArrayList<String> set=new ArrayList<String)();
set.add("it");
words.put(Integer.valueOf(2), set);
set.clear();
set.add("your");
set.add("real");
words.put(Integer.valueOf(4), set);

Etc.

In practice, you probably would regularly be adding words to an existing set. I often do that like this:

void addWord(String word)
{
  Integer key=Integer.valueOf(word.length());
  ArrayList<String> set=words.get(key);
  if (set==null)
  {
    set=new ArrayList<String>();
    words.put(key,set);
  }
  // either way we now have a set
  set.add(word);
}

Nota al margen: a menudo veo que los programadores finalizan un bloque como este al poner "set" nuevamente en el Hashmap, es decir, "words.put (key, set)" al final. Esto es innecesario: ya está ahí. Cuando obtienes "set" del Hashmap, obtienes una referencia, no una copia, por lo que cualquier actualización que hagas solo está "allí", no tienes que volver a colocarla.

Descargo de responsabilidad: este código está fuera de mi cabeza. No hay garantía expresa o implícita. No he escrito ningún Java en mucho tiempo, por lo que puedo tener errores de sintaxis o nombres de funciones incorrectos. :-)

Respuesta: 2

Como su clave parece ser un número entero pequeño, puede usar una lista de listas. En este caso, la solución más simple es usar un MultiMap como

Map<Integer, Set<String>> stringByLength = new LinkedHashMap<>();

for(String s: strings) {
   Integer len = s.length();
   Set<String> set = stringByLength.get(s);
   if(set == null)
        stringsByLength.put(len, set = new LinkedHashSet<>());
   set.add(s);
}
Respuesta: 3

No puedo obtener el valor del campo. Lo que intento hacer es obtener el objeto en tiempo de ejecución. Por favor, hágame saber a dónde voy mal. Test.class import java.lang.reflect.Field; Prueba de clase pública {...

Soy un principiante en Java 8. La no interferencia es importante para tener un comportamiento de flujo de Java consistente. Imagine que estamos procesando un gran flujo de datos y durante el proceso se cambia la fuente. ...

¿Hay alguna manera de omitir el enfoque a un componente en particular cuando usamos la tecla "Tab". Si el usuario hace doble clic en el componente, el foco debe ir a ese texto.

He intentado este código (la lista es ArrayList <List <Integer>>): list.stream (). FlatMap (Stream :: of) .collect (Collectors.toList ()); pero no hace nada; La lista sigue siendo una lista 2D. ¿Cómo puede ...