Foros del Web » Programación para mayores de 30 ;) » Java »

For, variable local final

Estas en el tema de For, variable local final en el foro de Java en Foros del Web. Hola Quiero crear una salida de datos en el que reuno la referencia de un autor con la referencia de su filiación. En autores tengo ...
  #1 (permalink)  
Antiguo 08/01/2015, 10:07
 
Fecha de Ingreso: enero-2011
Mensajes: 14
Antigüedad: 13 años, 10 meses
Puntos: 0
For, variable local final

Hola

Quiero crear una salida de datos en el que reuno la referencia de un autor con la referencia de su filiación. En autores tengo todos los autores, y en cada "cadena" toda la información que me ha dado la base de datos. cada objeto cadena tiene [ref,[nombres de autores],[filiaciones de autores],...]
Mi idea era recorrer el array de autores, buscar en que cadena aparece, coger la filiación que haya en esa posición, encontrar la referencia en el array de todas la filiaciones llamado filiaciones.

Lo he escrito así, pero java me dice que una variable local tiene que ser final. No entiendo el error.. akguna sugerencia?

Gracias!!!
Código:
for(int i=0;i<autores.length;i++){
       refs.entrySet().stream().forEach((cadena) -> {
            Registro valor=cadena.getValue();
            int idFil;
            for(int j=0;j<valor.autores.size();j++){
           if(valor.autores.get(j).equals(autores[i])){
               idFil=Arrays.binarySearch(filiaciones,valor.filiaciones.get(j));
           ps3.println((i+1)+","+(idFil+1));}
            }
       });
           }
  #2 (permalink)  
Antiguo 08/01/2015, 15:12
(Desactivado)
 
Fecha de Ingreso: enero-2013
Mensajes: 289
Antigüedad: 11 años, 9 meses
Puntos: 10
Respuesta: For, variable local final

no té dice cual es la variable que ha de ser final?

http://stackoverflow.com/questions/1...nside-listener
  #3 (permalink)  
Antiguo 08/01/2015, 17:20
 
Fecha de Ingreso: enero-2011
Mensajes: 14
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: For, variable local final

la j, me da error en la línea if(valor..
y me lo vuelve a indicar cuando la uso en ps3.println..
  #4 (permalink)  
Antiguo 08/01/2015, 19:41
(Desactivado)
 
Fecha de Ingreso: enero-2013
Mensajes: 289
Antigüedad: 11 años, 9 meses
Puntos: 10
Respuesta: For, variable local final

y si recorrieras el Map de diferente manera?

Código Java:
Ver original
  1. Map map = new HashMap();
  2. Iterator entries = map.entrySet().iterator();
  3. while (entries.hasNext()) {
  4.     Map.Entry entry = (Map.Entry) entries.next();
  5.     Integer key = (Integer)entry.getKey();
  6.     Integer value = (Integer)entry.getValue();
  7.     System.out.println("Key = " + key + ", Value = " + value);
  8. }
  #5 (permalink)  
Antiguo 09/01/2015, 02:13
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 3 meses
Puntos: 182
Respuesta: For, variable local final

Buenas,

El problema que tiene el compilador es la diferencia de ambitos entre la closure y el metodo que la contiene.

Las variables locales de un metodo se almacenan en una seccion de memoria llamada pila(stack) mientras que la closure se guarda en el heap. El caso es que la closure podria ejecutarse cuando el ambito de la pila haya terminado y la variable no este disponible o bien haya cambiado de valor. Por eso el compilador requiere declararla final, para asegurarse de que estara disponible y sin cambios cuando se utilice internamente.

Encuentro superrebuscado tu algoritmo, pero en cualquier caso se deberia solucionar el error de esta manera:

Código Java:
Ver original
  1. for(int i=0;i<autores.length;i++){
  2.        final String autorBuscado = autores[i];
  3.        refs.entrySet().stream().forEach((cadena) -> {
  4.             Registro valor=cadena.getValue();
  5.             int idFil;
  6.             for(int j=0;j<valor.autores.size();j++){
  7.            if(valor.autores.get(j).equals(autorBuscado )){
  8.                idFil=Arrays.binarySearch(filiaciones,valor.filiaciones.get(j));
  9.            ps3.println((i+1)+","+(idFil+1));}
  10.             }
  11.        });
  12.            }

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #6 (permalink)  
Antiguo 09/01/2015, 10:13
 
Fecha de Ingreso: enero-2011
Mensajes: 14
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: For, variable local final

Gracias!

Acabo de leer tu comentario.. y al final había conseguido arrgelarlo. Efectivamente con un final:

Código Java:
Ver original
  1. FileOutputStream fichero3 = new FileOutputStream("C://java//datosSalida2//Autor-filiacion.txt");
  2.         PrintStream ps3 = new PrintStream(fichero3);
  3.        
  4.          for(int i=0;i<autores.length;i++){
  5.              final int ifinal=i;
  6.        refs.entrySet().stream().forEach((cadena) -> {
  7.             Registro valor=cadena.getValue();
  8.             int idFil;
  9.             for(int j=0;j<valor.autores.size();j++){
  10.            if(valor.autores.get(j).equals(autores[ifinal])){
  11.                idFil=Arrays.binarySearch(filiaciones,valor.filiaciones.get(j));
  12.          
  13.                 ps3.println((ifinal+1)+","+(idFil+1));}
  14.             }});
  15.            }

Dices que es rebuscado.. ¿cómo crees qué podría simplificarlo?

Graciass
  #7 (permalink)  
Antiguo 09/01/2015, 10:26
 
Fecha de Ingreso: enero-2011
Mensajes: 14
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: For, variable local final

Mogin, he intentado leer el mapa de tu manera, y me sale este error:

Código Java:
Ver original
  1. Iterator refes=refs.entrySet().iterator();
  2.             while(refes.hasNext()){
  3.             Map.Entry entradas=(Map.Entry)refes.next();
  4.             Integer clave=(Integer)entradas.getKey();
  5.             Integer valor=(Integer)entradas.getValue();
  6.             System.out.println("Clave = " + clave + ", Valor = " + valor);
  7.             }

Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at german.LeerDatos.main(LeerDatos.java:72)

Y la línea 72 sería la de Integer clave


Gracias!

Etiquetas: final, local, valor, variable
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:50.