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

[SOLUCIONADO] Idioma Java

Estas en el tema de Idioma Java en el foro de Java en Foros del Web. Amigos, Una consulta, cual es el comando o el paquete o cualquier cosa para que mis programas como facturas u otras salga en el español. ...
  #1 (permalink)  
Antiguo 19/10/2014, 18:48
 
Fecha de Ingreso: agosto-2014
Mensajes: 68
Antigüedad: 10 años, 2 meses
Puntos: 1
Idioma Java

Amigos,
Una consulta, cual es el comando o el paquete o cualquier cosa para que mis programas como facturas u otras salga en el español. por ejemplo
en mi programación hay muchas letras con ñ o ó o las letras con acentos a la ahora de compilar y ejecutar el programa, me sale por ejemplo facturaci?3n en vez de decir facturación.

En ruby es una sola linea que es #encoding:UTF-8 (funciona todos los textos como debe ser).
En java ya ni me acuerdo cual era..
  #2 (permalink)  
Antiguo 20/10/2014, 04:10
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años, 5 meses
Puntos: 306
Respuesta: Idioma Java

Tienes que tener en cuenta que la codificación afecta tanto en el lugar donde tomas el dato como en el lugar en el que escribes.

Hay muchas clases a los que se le puede indicar el encoding, así que dependerá de tu código.

Primero asegúrate de que en java tienes la cadena correcta (con un breakpoint), si ahí está mal el problema está en la entrada del dato, si está bien el problema está en la salida.

Recuerda que la consola de windows usa el encoding Cp1250.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #3 (permalink)  
Antiguo 20/10/2014, 11:50
 
Fecha de Ingreso: agosto-2014
Mensajes: 68
Antigüedad: 10 años, 2 meses
Puntos: 1
Respuesta: Idioma Java

La verdad es muy raro.. Xerelo..
Estoy usando la nueva version de Java 8, y no lo veo ninguna mejora parecido en Ruby. y ademas es muy raro que no funcione en la plataforma en windows, pero funciona bien en Linux sin problema.
y otra cosa hice una prueba programacion con seleccion case. me sale un error. estoy intentando hacer otro programa de facturacion de modo consola msdos a lo antiguo.
y me sale un error
Código Java:
Ver original
  1. import java.util.Scanner;
  2. class Opciones2
  3. {
  4.     public static void main(String[] args)
  5.     {
  6.         String car;
  7.         //InputStreamReader entrada = new InputStreamReader(System.in);
  8.         BufferedReader entrada = new BufferedReader(new InputStreamReader(System.in));
  9.         //Scanner entrada = new Scanner(System.in);
  10.         System.out.print("Introduzca Una letra vocal ");
  11.         car = entrada.readLine();
  12.         if (car == 'a' || car == 'A')
  13.             System.out.println(car + " es una vocal");
  14.         else if ((car == 'e') || (car == 'E'))
  15.             System.out.println(car + " es una vocal");
  16.         else if ((car == 'i') || (car == 'I'))
  17.             System.out.println(car + " es una vocal");
  18.         else if ((car == 'o') || (car == 'O'))
  19.             System.out.println(car + " es una vocal");
  20.         else if ((car == 'u') || (car == 'U'))
  21.             System.out.println(car + " es una vocal");
  22.         else
  23.             System.out.println(car + " no es una vocal");
  24.     }
  25. }

el mensaje de error
C:\Sites\java\Opciones2.java:8: error: cannot find symbol
BufferedReader entrada = new BufferedReader(new InputStreamReader(System.in));
^
symbol: class BufferedReader
location: class Opciones2
C:\Sites\java\Opciones2.java:8: error: cannot find symbol
BufferedReader entrada = new BufferedReader(new InputStreamReader(System.in));
^
symbol: class BufferedReader
location: class Opciones2
C:\Sites\java\Opciones2.java:8: error: cannot find symbol
BufferedReader entrada = new BufferedReader(new InputStreamReader(System.in));
^
symbol: class InputStreamReader
location: class Opciones2
C:\Sites\java\Opciones2.java:12: error: incomparable types: String and char
if (car == 'a' || car == 'A')
^
C:\Sites\java\Opciones2.java:12: error: incomparable types: String and char
if (car == 'a' || car == 'A')
^
C:\Sites\java\Opciones2.java:14: error: incomparable types: String and char
else if ((car == 'e') || (car == 'E'))
^
C:\Sites\java\Opciones2.java:14: error: incomparable types: String and char
else if ((car == 'e') || (car == 'E'))
^
C:\Sites\java\Opciones2.java:16: error: incomparable types: String and char
else if ((car == 'i') || (car == 'I'))
^
C:\Sites\java\Opciones2.java:16: error: incomparable types: String and char
else if ((car == 'i') || (car == 'I'))
^
C:\Sites\java\Opciones2.java:18: error: incomparable types: String and char
else if ((car == 'o') || (car == 'O'))
^
C:\Sites\java\Opciones2.java:18: error: incomparable types: String and char
else if ((car == 'o') || (car == 'O'))
^
C:\Sites\java\Opciones2.java:20: error: incomparable types: String and char
else if ((car == 'u') || (car == 'U'))
^
C:\Sites\java\Opciones2.java:20: error: incomparable types: String and char
else if ((car == 'u') || (car == 'U'))
^
13 errors
[Finished in 1.0s]
  #4 (permalink)  
Antiguo 20/10/2014, 12:52
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años, 5 meses
Puntos: 306
Respuesta: Idioma Java

Ya te lo expliqué, Windows usa Cp1250 y linux UTF-8, por eso en uno se ve bien y en otro no. Si en vez de escribir a consola escribes a archivo diciendo que el encoding es UTF8 también lo verás bien.

El otro error te lo esta diciendo bien claro, no puedes comparar String con char. readLine devuelve String y comillas simple es char.

Ruby y java no son lo mismo, cuanto antes lo asumas y dejes de pensar que deberían funcionar igual, más rápido avanzarás.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #5 (permalink)  
Antiguo 20/10/2014, 13:08
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 9 meses
Puntos: 260
Sonrisa Respuesta: Idioma Java

Hola,

Cita:
Iniciado por croelanjr Ver Mensaje
... Estoy usando la nueva version de Java 8,
Código Java:
Ver original
  1. car = entrada.readLine();
  2.         if (car == 'a' || car == 'A')
  3.             System.out.println(car + " es una vocal");
  4.         else if ((car == 'e') || (car == 'E'))
  5.             System.out.println(car + " es una vocal");
  6.         else if ((car == 'i') || (car == 'I'))
  7.             System.out.println(car + " es una vocal");
  8.         else if ((car == 'o') || (car == 'O'))
  9.             System.out.println(car + " es una vocal");
  10.         else if ((car == 'u') || (car == 'U'))
  11.             System.out.println(car + " es una vocal");
  12.         else
  13.             System.out.println(car + " no es una vocal");
Adicionalmente, desde Java 7 tienes la palabra reservada switch funcionando con String. Por lo que posiblemente podrías escribirlo así:

Código Java:
Ver original
  1. car = entrada.readLine();
  2. if (car != null && car.length() > 1) { // Chequeo ingreso datos
  3.   switch (car.toUpperCase()) {
  4.     case "A":
  5.     case "E":
  6.     case "I":
  7.     case "O":
  8.     case "U":
  9.       System.out.println(car + " es una vocal");
  10.       break;
  11.     default:
  12.       System.out.println(car + " no es una vocal");
  13.       break;
  14.   }
  15. }

Todas las vocales están en la tabla simple ASCII, así que es la misma en UTF-8 que ISO-8859-1 y la mayoría de tablas, por lo que, en este problema no hay nada con el encoding.

Saludos,
  #6 (permalink)  
Antiguo 20/10/2014, 15:49
 
Fecha de Ingreso: agosto-2014
Mensajes: 68
Antigüedad: 10 años, 2 meses
Puntos: 1
Respuesta: Idioma Java

Hola HAckman, muchas gracias por tu aporte. Sobre el tema de UTF-8 es un tema aparte, el codigo que publique es otro tema. solamente he agregado mis dudas.
ahora bien, acabo de leer un libro de Java para comprobar si realmente funciona, y ahora resulta no funciona
Código Java:
Ver original
  1. import java.io.*;
  2.  
  3. class Letras1
  4. {
  5.     public static void main(String[] args)
  6.     {
  7.         char primero, ultimo;
  8.         System.out.printf("Introduzca su primera y ultima inicial: ");
  9.         primero = System.in.read();
  10.         ultimo = System.in.read();
  11.         System.out.println("Hola, " + primero + "." + ultimo + ".!\n");
  12.     }
  13.  
  14. }
C:\Sites\java\Letras1.java:9: error: incompatible types: possible lossy conversion from int to char
primero = System.in.read();
^
C:\Sites\java\Letras1.java:10: error: incompatible types: possible lossy conversion from int to char
ultimo = System.in.read();
^
2 errors
[Finished in 1.5s with exit code 1]

Por favor necesito una explicacion, porque no compila, si la variable es caracteres,
Ahora con respecto el codigo anterior con if y else lo cambie las comillas, y ahora resulta que sale otro error.
Código Java:
Ver original
  1. import java.util.Scanner;
  2. class Opciones2
  3. {
  4.     public static void main(String[] args)
  5.     {
  6.         String car;
  7.         BufferedReader entrada = new BufferedReader(new InputStreamReader(System.in));
  8.         System.out.println("Introduzca Una letra vocal ");
  9.         car = entrada.next();
  10.         if ((car == "a") || (car == "A"))
  11.             System.out.println(car + " es una vocal");
  12.         else if ((car == "e") || (car == "E"))
  13.             System.out.println(car + " es una vocal");
  14.         else if ((car == "i") || (car == "I"))
  15.             System.out.println(car + " es una vocal");
  16.         else if ((car == "o") || (car == "O"))
  17.             System.out.println(car + " es una vocal");
  18.         else if ((car == "u") || (car == "U"))
  19.             System.out.println(car + " es una vocal");
  20.         else
  21.             System.out.println(car + " no es una vocal");
  22.     }
  23. }

sale este error en este mensaje de if y else
C:\Sites\java\Opciones2.java:7: error: cannot find symbol
BufferedReader entrada = new BufferedReader(new InputStreamReader(System.in));
^
symbol: class BufferedReader
location: class Opciones2
C:\Sites\java\Opciones2.java:7: error: cannot find symbol
BufferedReader entrada = new BufferedReader(new InputStreamReader(System.in));
^
symbol: class BufferedReader
location: class Opciones2
C:\Sites\java\Opciones2.java:7: error: cannot find symbol
BufferedReader entrada = new BufferedReader(new InputStreamReader(System.in));
^
symbol: class InputStreamReader
location: class Opciones2
3 errors
[Finished in 0.9s with exit code 1]
Por favor necesito este apoyo para comprender usando con char
  #7 (permalink)  
Antiguo 20/10/2014, 20:14
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 9 meses
Puntos: 260
Sonrisa Respuesta: Idioma Java

Hola,

Cita:
Iniciado por croelanjr Ver Mensaje
... Estoy usando la nueva version de Java 8, y no lo veo ninguna mejora parecido en Ruby. ...
Cita:
Iniciado por croelanjr Ver Mensaje
Hola HAckman, muchas gracias por tu aporte. Sobre el tema de UTF-8 es un tema aparte, el codigo que publique es otro tema. solamente he agregado mis dudas.
Exactamente, eso lo comprendí bien, lo de UTF-8 ya Xerelo te dio la explicación del motivo por el cual funciona en Linux pero no funciona en Windows. Básicamente es porque, normalmente en Linux la Terminal es UTF-8 y en Windows la Consola es Windows-1250.

La solución mas simple es agregar en la línea de comandos, cuando ejecutas java, el encoding de todos los archivos de salida, no es la mejor solución simplemente la mas fácil.

java -Dfile.encoding=cp1252 org.package.MyClass

Pero como comentas que en Java 8 no ha habido mejoras, te puse un ejemplo de una mejora de Java 7, que ya puedes usar String en el switch. Hay algunas mejoras, no muchas pero si algunas; eso sí, el hecho que no las conozcas no significa que no hayan habido. Y definitivamente el ejemplo está bien aplicado, en lugar de usar un montón de if/then/else que tienen mucha similitud, se usa el switch, que para eso sirve.

Cita:
Iniciado por croelanjr Ver Mensaje
C:\Sites\java\Letras1.java:9: error: incompatible types: possible lossy conversion from int to char
primero = System.in.read();
El mismo problema que ya te mencionó Xerelo, en este caso estas intentando convertir un Integer en un Character, que no son lo mismo. Como se mencionó antes que un Character no era lo mismo que un String. El método read() devuelve un Integer y la variable primero está declarada como Character (char).

Cita:
Iniciado por croelanjr Ver Mensaje
C:\Sites\java\Opciones2.java:7: error: cannot find symbol
BufferedReader entrada = new BufferedReader(new InputStreamReader(System.in));
^
En ese caso te está diciendo que no has importado BufferedReader, ni InputStreamReader.

Código Java:
Ver original
  1. import java.io.BufferedReader;
  2. import java.io.InputStreamReader;
Saludos,

Última edición por HackmanC; 20/10/2014 a las 20:22 Razón: agregar read devuelve Integer ...
  #8 (permalink)  
Antiguo 21/10/2014, 08:37
 
Fecha de Ingreso: agosto-2014
Mensajes: 68
Antigüedad: 10 años, 2 meses
Puntos: 1
Respuesta: Idioma Java

Hola Hackman, Gracias por el aporte. Primero vamos por parte para no marearnos.
De acuerdo a lo anterior, el codigo que he publicado, lo he sacado del libro de Programacion en Java 6 Autor Luis Joyanes Aguilar - Primera edición. Los ejemplos en numero enteros y decimales funciona bien en Java 8, ahora hago los ejercicios con letras y algunos funciona con String usando la clase Scanner, ahora bien trato de utilizar en char (letra por letra), y adjunto este ejercio mencionado anteriormente en lo cual no sale lo que indica en el Libro o me equivoco en algo. he copiado exactamente igual en el Libro, lo que no entiendo porque no compila.
Código Java:
Ver original
  1. import java.io.*;
  2.      
  3.     class Letras1
  4.     {
  5.         public static void main(String[] args)
  6.         {
  7.             char primero, ultimo;
  8.             System.out.printf("Introduzca su primera y ultima inicial: ");
  9.             primero = System.in.read();
  10.             ultimo = System.in.read();
  11.             System.out.println("Hola, " + primero + "." + ultimo + ".!\n");
  12.         }
  13.      
  14.     }
y eso lo que sale en el mensaje de error
C:\Sites\java\Letras1.java:11: error: incompatible types: possible lossy conversion from int to char
primero = System.in.read();
^
C:\Sites\java\Letras1.java:12: error: incompatible types: possible lossy conversion from int to char
ultimo = System.in.read();
^
2 errors
[Finished in 0.6s]

Yo pregunto, en algunos libros hay errores como el Libro de Luis Joyanes, en la programación.

Ahora bien, mi curiosidad es que deseo hacer programa con selecion en base de sistema de facturacion estilo terminal como linux o como cmd. por ejemplo un metodo donde indique "Desea continuar (S)i o (N)o?" , en la cual presiono la tecla S o N. , eso lo que estoy tratando de practicar en esta parte de la programación indicado anteriormente, igualmente con los vocales.
  #9 (permalink)  
Antiguo 21/10/2014, 12:36
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 9 meses
Puntos: 260
Sonrisa Respuesta: Idioma Java

Hola,

Cita:
Iniciado por croelanjr Ver Mensaje
... Yo pregunto, en algunos libros hay errores como el Libro de Luis Joyanes, en la programación. ...
No sé que tan nuevo o antiguo sea ese libro, pero posiblemente sea un problema nuevo introducido para corregir versiones anteriores, según lo que recuerdo al igual que el lenguaje C/C++, Java tendía a convertir un int en char cuando era necesario, básicamente un char de C usa 32 bits al igual que el int (en el caso del x86 de 32 bits). No me acuerdo realmente, pero uno cabe dentro del espacio del otro.

Pero eso no significa que sea buena idea convertir de uno a otro indiscriminadamente. Posiblemente ya no es así y ahora tira una excepción, de igual forma no es aconsejable hacerlo; porque depende de cosas que a ti en este caso posiblemente no te van a servir, pero están implementadas porque a muchos les es funcional; como el caso de que un Character usa 64 bits, o dos bytes para darle espacio a Unicode.

Cita:
Iniciado por croelanjr Ver Mensaje
... por ejemplo un metodo donde indique "Desea continuar (S)i o (N)o?" , en la cual presiono la tecla S o N. , ...
El stdin está declarado en la clase java.lang.System como un InputStream, así que tienes que usar el método read(), pero te devuelve un Integer. Opcionalmente puedes usar la clase java.util.Scanner que tiene otros métodos para leer del teclado.

Posiblemente te funcione haciendo un cast a char, aunque no estoy seguro como se va a comportar en todos los escenarios. Adicionalmente tienes que agregar un read() en medio para que se 'coma' el 'espacio vacío entre las dos letras':

Código Java:
Ver original
  1. primero = (char) System.in.read();
  2.             System.in.read();
  3.             ultimo = (char) System.in.read();

Saludos,

Última edición por HackmanC; 21/10/2014 a las 12:45 Razón: correcciones
  #10 (permalink)  
Antiguo 23/10/2014, 15:29
 
Fecha de Ingreso: agosto-2014
Mensajes: 68
Antigüedad: 10 años, 2 meses
Puntos: 1
Respuesta: Idioma Java

Hackman, ya hice a tu consejo.. la verdad no funciona ni caramelo. ya estoy rompiendo la cabeza con mi laptop. :) En poca palabra el Libro de Programación de Java 6 de Luis Joyanes es pura mentira que nada funciona. y ademas te aclaro el libro es la edicion 2011. Ahora bien, con todo lo que indicas, se me prendio el foco, repase un libro de Java en Ingles, donde indicaba que pueda convertir en caracteres con la clase Scanner. Ahi ya me funciono en las dos condiciones de if y switch.
Le comparto el codigo 100% funcionando en caso que necesitan un programa estilo terminal como linux.
Codigo en Java con IF
Código Java:
Ver original
  1. import java.io.File;
  2. import static java.lang.System.out;
  3. import java.util.Scanner;
  4.  
  5. class Opciones2
  6. {
  7.     public static void main(String[] args)
  8.     {
  9.         Scanner teclado = new Scanner(System.in);
  10.         char car;
  11.         System.out.print("Introduzca Una letra vocal ");
  12.         car = teclado.findWithinHorizon(".",0).charAt(0);
  13.         if ((car == 'a') || (car == 'A'))
  14.             System.out.println(car + " es una vocal");
  15.         else if ((car == 'e') || (car == 'E'))
  16.             System.out.println(car + " es una vocal");
  17.         else if ((car == 'i') || (car == 'I'))
  18.             System.out.println(car + " es una vocal");
  19.         else if ((car == 'o') || (car == 'O'))
  20.             System.out.println(car + " es una vocal");
  21.         else if ((car == 'u') || (car == 'U'))
  22.             System.out.println(car + " es una vocal");
  23.         else
  24.             System.out.println(car + " no es una vocal");
  25.     }
  26. }

Codigo Java con Switch
Código Java:
Ver original
  1. import java.io.File;
  2. import static java.lang.System.out;
  3. import java.util.Scanner;
  4.  
  5. class Opciones3
  6. {
  7.     public static void main(String[] args)
  8.     {
  9.         Scanner teclado = new Scanner(System.in);
  10.         char car;
  11.         System.out.print("Introduzca Una letra vocal ");
  12.         car = teclado.findWithinHorizon(".",0).charAt(0);
  13.         switch (car)
  14.         {  
  15.             case 'a': case 'A':
  16.             case 'e': case 'E':
  17.             case 'i': case 'I':
  18.             case 'o': case 'O':
  19.             case 'u': case 'U':
  20.             System.out.println(car + " es una vocal");
  21.             break;
  22.             default:
  23.             System.out.println(car + " no es una vocal");
  24.         }
  25.     }
  26. }

Bueno eso es todo lo que queria hacer...
Saludos,
  #11 (permalink)  
Antiguo 24/10/2014, 13:11
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 2 meses
Puntos: 182
Respuesta: Idioma Java

Buenas,

El
car = teclado.findWithinHorizon(".",0).charAt(0);

Aunque funciona, es un poco rebuscado, ya que está pensado para encontrar un patrón en un offset determinado.

Sería más correcto hacer simplemente esto:
car = teclado.next().charAt(0);

un saludo
__________________
If to err is human, then programmers are the most human of us
  #12 (permalink)  
Antiguo 24/10/2014, 14:57
 
Fecha de Ingreso: agosto-2014
Mensajes: 68
Antigüedad: 10 años, 2 meses
Puntos: 1
Respuesta: Idioma Java

Profesor,
Muchas gracias por tu gentil respuesta. si efectivamente tambien funciona y es simple. lo que me llama la atención cual es la diferencia lo que usted estas indicando y porque es rebuscado.

Por favor exigo una explicación.
saludos,
  #13 (permalink)  
Antiguo 24/10/2014, 15:08
 
Fecha de Ingreso: agosto-2014
Mensajes: 68
Antigüedad: 10 años, 2 meses
Puntos: 1
Respuesta: Idioma Java

Profesor,
Muchas gracias por tu gentil respuesta. si efectivamente tambien funciona y es simple. lo que me llama la atención cual es la diferencia lo que usted estas indicando y porque es rebuscado.

Por favor exigo una explicación.
saludos,
  #14 (permalink)  
Antiguo 24/10/2014, 16:53
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años, 5 meses
Puntos: 306
Respuesta: Idioma Java

Exijo y por favor no pueden ir en la misma frase.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #15 (permalink)  
Antiguo 25/10/2014, 12:00
 
Fecha de Ingreso: agosto-2014
Mensajes: 68
Antigüedad: 10 años, 2 meses
Puntos: 1
Respuesta: Idioma Java

Xerelo:
De acuerdo a tus comentarios, a que se refiere.. Se claro a tus respuestas.. No te entiendo ni papa.. ni cebolla..

Respuesta: Idioma Java
Exijo y por favor no pueden ir en la misma frase.
  #16 (permalink)  
Antiguo 27/10/2014, 01:34
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 2 meses
Puntos: 182
Respuesta: Idioma Java

Cita:
Iniciado por croelanjr Ver Mensaje
Profesor,
Muchas gracias por tu gentil respuesta. si efectivamente tambien funciona y es simple. lo que me llama la atención cual es la diferencia lo que usted estas indicando y porque es rebuscado.

Por favor exigo una explicación.
saludos,
Estimado croelanjr, si lees con atencion mi post podras encontrar tu mismo la respuesta a tu inquietud:

Cita:
Aunque funciona, es un poco rebuscado, ya que está pensado para encontrar un patrón en un offset determinado.
El metodo next simplemente almacena el siguiente caracter introducido por consola, que es lo que buscas.
El metodo findWithinHorizon recorre el buffer buscando un patron (una expresion regular) devolviendo el texto que encaje con este. Para ello utiliza en realidad Pattern.compile(pattern, horizon). Esto es muchisimo mas costoso a nivel de procesamiento cuando lo que en realidad lo unico que queremos es recuperar un caracter.
Por entendernos, funciona, pero es como matar moscas a canonazos.

Puedes consultarlo en la propia documentacion de Java o indagar en el propio codigo fuente de la clase:
http://docs.oracle.com/javase/7/docs....String,%20int)

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #17 (permalink)  
Antiguo 28/10/2014, 09:57
 
Fecha de Ingreso: agosto-2014
Mensajes: 68
Antigüedad: 10 años, 2 meses
Puntos: 1
Respuesta: Idioma Java

Gracias por tu respuesta Profesor.
Lo he revisado detenidamente, lo que sucede ... Estaba investigando en varios libros, entiendo que cada autor tiene su manera de explicar , enseñar y programar en diferente forma. en la teoria se entiende como todos los libros pero en la practica es muy diferente. Es solo una observación, lo que indago en los libros para programar Java.
Ahora bien, he revisado en las revistas de Java - Oracle en un reportaje que va a incluir Lambda para Java 8, lambda es muy parecido a Ruby para abreviar el codigo como por ejemplo la cantidad de cadena en ruby cadena.size, Java cadena.length, y otros comandos lo que he visto. De toda manera, voy a indagar mas información en el libro de Lambda para Java.
saludo,
  #18 (permalink)  
Antiguo 28/10/2014, 10:29
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 2 meses
Puntos: 182
Respuesta: Idioma Java

Efectivamente los lambdas permiten un estilo de programacion mas funcional en Java. Tienen una gran potencia sobre todo por la facilidad que ofrecen para hacer tratamiento de algoritmos usando paralelismo con estrategias map/reduce.

Por otro lado permiten evitar el uso de las clases anonimas Java, que siempre me han parecido una chapuza de diseno.


Cita:
en un reportaje que va a incluir Lambda para Java 8
No las van a incluir, sino que existen ya desde que se presento Java 8 en marzo, asi que ya las puedes utilizar.

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #19 (permalink)  
Antiguo 28/10/2014, 11:05
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 9 meses
Puntos: 260
Sonrisa Respuesta: Idioma Java

Hola,

Cita:
Iniciado por Profesor_Falken Ver Mensaje
... Por otro lado permiten evitar el uso de las clases anonimas Java, que siempre me han parecido una chapuza de diseno.
...
Aprovechando el hilo y si me lo permites, me gustaría saber ¿por qué las clases anónimas te parecen una chapuza de diseño?

Saludos,
  #20 (permalink)  
Antiguo 28/10/2014, 15:10
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 2 meses
Puntos: 182
Respuesta: Idioma Java

Buenas,

Estoy un poco cansado ahora, pero te comento. Cuando se creo Java existía una importante carencia, que es la posibilidad de crear punteros a función que puedan ser pasados como parámetros. Para solucionar este problema concreto se implementaron las clases anónimas como solución para "salir del paso".
Como sabes, la función anónima consiste en incrustar el código de una clase y su implementación dentro de la llamada a un método, lo cual ya estéticamente rompe el flujo del código. Por otro lado impone excepciones a las reglas básicas de Java al permitir por ejemplo hacer un new de una interface, la cual en realidad se implementa "on the fly". Esto crea muchas dudas a los principiantes. Además, para acceder a cualquier variable de la clase que contiene a la clase anónima, estamos obligados a declarar dichas variables como final (el compilado obliga a hacerlo así para evitar accesos incorrectos, ya que estas variables podrían ser modificadas accidentalmente).
Todos esto es fácilmente solucionable con una implementación de closures como la de C#, que es mucho más lógica y elegante, y que por eso Java ha plagiado (en venganza quizás por el plagio que supuso C# en su momento ) en su versión 8
Un ejemplo vale más de mil palabras:

Función anónima:
Código Java:
Ver original
  1. button.addActionListener(new ActionListener() {
  2.     public void actionPerformed(ActionEvent ae) {
  3.         System.out.println("Action Detected");
  4.     }
  5.  });

Closures:
Código Java:
Ver original
  1. button.addActionListener(e -> {System.out.println("Action Detected");});

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #21 (permalink)  
Antiguo 28/10/2014, 15:46
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 9 meses
Puntos: 260
Sonrisa Respuesta: Idioma Java

Hola,

Excelente. Siempre es bueno tener un punto de vista diferente para hacerse un criterio mas amplio. Por el momento no he cambiado a Lambda por algunos de los motivos que mencionas, como que rompen el flujo visual del programa, y que no pueden accesar variables externas (o algo así, posiblemente con final, pero no estoy seguro). Entiendo que lo estabas aplicando a las funciones anónimas.

Voy a analizar lo que comentas para ver si, por fin, hago el cambio definitivamente. En lo personal me gustan mucho las funciones anónimas, pero eso ya será de cada quien.

Muchas gracias,
  #22 (permalink)  
Antiguo 29/10/2014, 00:46
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 2 meses
Puntos: 182
Respuesta: Idioma Java

Buenas,

Te gustan porque las clases anónimas son muy útiles, ya que es una estructura que te permite hacer algo que no se puede hacer de ninguna otra forma. Yo las he usado un montón y las sigo usando cuando no desarrollo en Java 8, por supuesto!.

Sin embargo, tambien creo que es un modelo poco afortunado y que no ha tenido mucho éxito. De hecho Java es el único lenguaje que ha optado por una solución como esta para resolver los punteros a función.
Todos los lenguajes que conozco (C, Python, JavaScript, PHP, C#, Go) utilizan una solución de alguna forma basada en closures, incluso aquellos que se basaron en la sintaxis Java (C# y de alguna forma Go) desecharon desde el principio el mecanismo de funciones anónimas y adoptaron el de closures.

De cualquier forma, la sustitución de las funciones anónimas no deja de ser un tema "cosmético". Como comentaba más arriba, para mi lo más importante y potente que ofrecen los lambdas es que permiten paralelizar tareas de forma trivial. No hace mucho, puse un ejemplo para hacer un cálculo utilizando todos los cores del procesador sin necesidad de declarar ni un solo thread, usando lambdas;
http://www.forosdelweb.com/f45/canti...iempo-1111410/

Agrego un par de reflexiones sobre las clases anonimas cuando se comenzo a hablar de usar closures para reemplazarlas. Son James Gosling (creador de java) y Brian Goetz (ingeniero en Sun)

https://blogs.oracle.com/jag/entry/closures
http://www.ibm.com/developerworks/library/j-jtp04247/

James Gosling hablando de las clases anonimas:
"[...] In the early days of Java the lack of closures was pretty painful, and so inner classes were born: an uncomfortable compromise that attempted to avoid a number of hard issues. But as is normal in so many design issues, the simplifications didn't really solve any problems, they just moved them. We should have gone all the way back then.[...]"

Un saludo
__________________
If to err is human, then programmers are the most human of us

Última edición por Profesor_Falken; 29/10/2014 a las 01:41
  #23 (permalink)  
Antiguo 29/10/2014, 03:03
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años, 5 meses
Puntos: 306
Respuesta: Idioma Java

La verdad es que a mí las clases anónimas me parecen útiles cuando se pone en ellas código sencillo y corto, pero últimamente estoy viendo en ellas tochacos que no me gustan nada (GWT).

Todavía no me he animado a ver nada de Java 8, pero es cierto que las lambda tienen buena pinta.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.

Etiquetas: idioma, programa
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 00:56.