Problemas con for y concatenar caracteres.

Iniciado por #Aitor, 24 Junio 2017, 22:24 PM

0 Miembros y 1 Visitante están viendo este tema.

#Aitor

Buenas, estoy probando Android Studio, nunca antes había programado en Java, por lo que se me está haciendo un poco lidioso por la cantidad de cosas diferentes a otros lenguajes.

Me surgieron estas dos preguntas. Este es el código:

Código (java) [Seleccionar]

             for(int i = 0; i < text1.length(); i++) {
                 String ejemplo = "";
                 ejemplo += text1.charAt(i);

                 editText1.setText("Carácteres: " + ejemplo);
             }



Encuentro los siguientes problemas, (empezaré por los que a mí más me importan).

1. La variable ejemplo muestra el último carácter del string, y no la cadena entera que esperaba formar.
2. La variable ejemplo no es accesible desde fuera del for.


Otras curiosidades o problemas que he tenido:


1. La variable ejemplo la he necesitado inicializar debido a que no me dejaba compilar sin haberla inicializado.





EDIT:
Código (java) [Seleccionar]

     String ejemplo = "";

              for(int i = 0; i < text1.length(); i++) {

                  ejemplo += text1.charAt(i);


              }
                editText1.setText("Carácteres: " + ejemplo);


Vale, declarar la variable fuera y antes del for, de esta forma es accesible desde fuera del for y durante éste. La cosa ahora es, ¿No puedo compilarla sin inicializarla?
Mi algoritmo en PHP (estupideces y más).
Código (php) [Seleccionar]
while($Se_feliz){
  Piensa_un_OBJETIVO(); // Sin excusas!
  if($Tienes_un_objetivo){
    Suspira(); // Sé paciente.
    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
      //RETURN; ¿O volvemos a empezar?
    }else{
      Inténtalo_de_nuevo();
    }
  }
}

3n31ch

Cita de: #Aitor en 24 Junio 2017, 22:24 PMnunca antes había programado en Java, por lo que se me está haciendo un poco lidioso por la cantidad de cosas diferentes a otros lenguajes.

Antes que nada, aclarar, que en tu código lo único "raro" que no he visto en otros lenguajes es el charAt, y teniendo en consideración que sabes PHP (por tu firma) he de suponer que sabes javascript, así que esto tampoco es nuevo.  :-X

(Si te refieres a Java en general... si tiene sus cosas raras, pero tampoco tanto. Así que sigue estudiándolo, a ver si este foro se hace mas activo  :P)

Ahora. Como bien identificaste el error estaba en que declarabas el String dentro del for y por tanto siempre hacia un reset del valor a "" y luego almacena un carácter: Resultado final, un String con el ultimo carácter.

Respectos la accesibilidad de la variable(punto 2) tiene que ver con esto: http://www.javawithus.com/tutorial/scope-and-lifetime-of-variables
Y si lo vez por el lado de la "lógica", lo que te esta diciendo java es que si por ejemplo "text1" no tuviera caracteres entonces el String ejemplo nunca seria declarado, por tanto la variable no existirá. Para evitar este tipo de errores Java te obliga a que lo declares antes.

Respecto a tu nueva curiosidad: Esto sucede debido a que en el ciclo for haces un +=, dicho carácter de asignación lo que hace es añadir al String YA EXISTENTE un conjunto de caracteres nuevos. Por tanto, si tu no inicializaras el String previamente, entonces no tendrías un String con valores YA EXISTENTES, y por tanto, arrojara error semántico. Esto lo detecta el compilador y te arroja error.



#Aitor

Cita de: 3n31ch en 26 Junio 2017, 01:40 AM
Antes que nada, aclarar, que en tu código lo único "raro" que no he visto en otros lenguajes es el charAt, y teniendo en consideración que sabes PHP (por tu firma) he de suponer que sabes javascript, así que esto tampoco es nuevo.  :-X

(Si te refieres a Java en general... si tiene sus cosas raras, pero tampoco tanto. Así que sigue estudiándolo, a ver si este foro se hace mas activo  :P)

Ahora. Como bien identificaste el error estaba en que declarabas el String dentro del for y por tanto siempre hacia un reset del valor a "" y luego almacena un carácter: Resultado final, un String con el ultimo carácter.

Respectos la accesibilidad de la variable(punto 2) tiene que ver con esto: http://www.javawithus.com/tutorial/scope-and-lifetime-of-variables
Y si lo vez por el lado de la "lógica", lo que te esta diciendo java es que si por ejemplo "text1" no tuviera caracteres entonces el String ejemplo nunca seria declarado, por tanto la variable no existirá. Para evitar este tipo de errores Java te obliga a que lo declares antes.

Respecto a tu nueva curiosidad: Esto sucede debido a que en el ciclo for haces un +=, dicho carácter de asignación lo que hace es añadir al String YA EXISTENTE un conjunto de caracteres nuevos. Por tanto, si tu no inicializaras el String previamente, entonces no tendrías un String con valores YA EXISTENTES, y por tanto, arrojara error semántico. Esto lo detecta el compilador y te arroja error.




Buenas, primero que nada muchas gracias.

Sobre lo de el código, es cierto que la parte que expuse no hay nada raro más de los problemas que me daba, el SetText y el ChartAt, pero detrás de eso había bastante lineas de código que se me habían hecho raras, como la necesidad de pasar los valores obtenidos a String porque los devuelve al principio como un editable todo raro, y demás movidas...  ;-) :silbar:

Respecto a las dudas resueltas, tienen todo el sentido del mundo, y ahora realmente las encuentro lógicas y coherentes.

Lo dicho, muchas gracias.

PD: ¿Qué le está pasando al foro? No suelo pasarme mucho por aquí, la verdad, cuándo me da la neura de tocar algo que tenga que ver con la programación o alguna duda repentina, pero recuerdo esos tiempos en el que Dvyr y Elektro respondían absolutamente a cada uno de los comentarios que había, y con ellos muchos otros usuarios. ¿Dónde demonios están?

Saludos!
Mi algoritmo en PHP (estupideces y más).
Código (php) [Seleccionar]
while($Se_feliz){
  Piensa_un_OBJETIVO(); // Sin excusas!
  if($Tienes_un_objetivo){
    Suspira(); // Sé paciente.
    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
      //RETURN; ¿O volvemos a empezar?
    }else{
      Inténtalo_de_nuevo();
    }
  }
}