[Problema] Propiedad Derivada que devuelva Mayusculas.

Iniciado por LaLakers94, 6 Noviembre 2013, 17:04 PM

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

LaLakers94

Hola, a todos. Soy nuevo y apenas he iniciado mi aventura con Java.

Resulta que tengo que crear un programita y me he quedado bastante pillado en la declaración de una propiedad derivada.

Esta propiedad tendría que devolver las siglas de un nombre (propiedad no derivada).

Código (javascript) [Seleccionar]
public class AsignaturaImpl {

//Atributos:
private String nombre, codigo, departamento, acronimo;
private Double creditos;
private TipoAsignatura tipo;
private Integer curso;

//Metodos Get.
public String getNombre() {
return nombre;
}
public String getCodigo() {
return codigo;
}
public String getDepartamento() {
return departamento;
}

public Double getCreditos() {
return creditos;
}
public TipoAsignatura getTipo() {
return tipo;
}
public Integer getCurso() {
return curso;
}
//Derivadas
public String getAcronimo() { //Derivada de Nombre

return acronimo;
}



}



egyware

#1
Sabes que es un constructor?
O una función setter (mutador)


Bueno tu código compila (solo con verlo compila), lo que te veo con problemas es que no sabes que hacer con el. Bueno averigua que es un contructor o un setter.

Saludos!

PS: Talvez esto es lo que necesitas http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html#toUpperCase()

LaLakers94

Hola!
Métodos constructores y set? Creo que sí.
Los constructores para crear los objetos y establecer el estado inicial de estos. Y los métodos set para modificar el estado del objeto, ¿no?

Lo dices porque faltaría en el código? El constructor sí y los métodos setter no debería incluirlos si el enunciado me dice que son propiedades solo consultables, ¿no? Además también debo incluír un método toString pero de momento voy por la declaración de la propiedad derivada Acronimo y es que no tengo ni idea de como hacer que devuelva las siglas del nombre.

Un bucle for que recorra las letras y devuelva las mayúsculas?

egyware


Mitsu

No entiendo qué es lo que deseas hacer en tu algoritmo.

Lo que he 'entendido' es que quieres que se devuelvan las siglas en Mayúsculas de un nombre en concreto. Ahora, se me ocurre una forma sencilla.

Código (=java) [Seleccionar]

private String doSiglasNombre(final String nombre) {
      String siglas = "";
      String[] partesNombre = nombre.split(" ");
     
      for (String parte : partesNombre) {
        // Extrae la primera letra de cada parte del nombre, luego la convierte a String
        // porque charAt(index) devuelve un char, y lo convierte a mayuscula con 'toUpperCase()'
        siglas += String.valueOf(parte.charAt(0)).toUpperCase();
      }
      return siglas;
    }

LaLakers94

#5
Cita de: egyware en  6 Noviembre 2013, 19:29 PM
Bueno me confundí con el código que pusiste, pero creo que lo que necesitas es esto.

http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#toUpperCase()

Creo que ha sido fallo mío que me he explicado como el culo, he pegado ahí todo el código a cuanta de qué. Gracias!

Cita de: M1t$u en  6 Noviembre 2013, 20:34 PM
No entiendo qué es lo que deseas hacer en tu algoritmo.

Lo que he 'entendido' es que quieres que se devuelvan las siglas en Mayúsculas de un nombre en concreto. Ahora, se me ocurre una forma sencilla.


Eso mismo, acronimo devuelve las siglas en mayúsculas del nombre, muchas gracias! Con esa idea a ver si soy capaz de pasarlo a un for clásico (supongo que una variable (i) que recorra el nombre y lo devuelva en caso de ser Mayusculas, ¿no?

Siento haberme explicado tan mal. Lo que me pide el enunciado es crear el tipo Asignatura con esas propiedades (todas consultables) y ya las he declarado en la interface correspondiente. Luego me pide una clase para la interface y a la hora de generar los getters me he quedado estancado en el código de acronimo (propiedad derivada de nombre).

¿Estaría esto bien?

Código (javascript) [Seleccionar]
public String getAcronimo() {
String siglas = "";
Character letra = getNombre().charAt(0);
for (Integer i = 0; i<getNombre().length(); i++) {
if (letra.isUpperCase(i)){
siglas += letra;
}

}
return siglas;

Mitsu

#6
Tu idea de tu método está bien, pero tiene algunas fallas como:

Código (=java) [Seleccionar]

letra.isUpperCase(i)


El método isUpperCase si no me equivoco, acepta un parámetro char. Aquí le estás pasando un Integer.

Poner esto antes del for es redundante:

Código (=java) [Seleccionar]

Character letra = getNombre().charAt(0);


Esa instrucción solo la haces una vez en donde obtienes la primera letra de lo que devuelve getNombre(). Luego en el for recorres getNombre(), por lo que la sentencia anterior no tiene caso colocarla.

Para hacer más ordenado y simple el algoritmo, podemos hacer lo siguiente:

1) Obtener el nombre de la asignatura
2) Transformarlo a un array de char
3) Recorrer el array en busca de letras Mayúsculas
4) Si es mayúscula, se agrega al String que contendrá las siglas.
5) Devolver las siglas

Nota: No utilizo Character por que el método toCharArray() devuelve un array de char y no hay forma de hacer un cast de este array char a un array Character.

Otra cosa, para estos procesos sencillos utiliza tipos primitivos que se adapten al algoritmo, como son: short, byte, int, float, double, etc. Integer, Character, etc, son objetos y son usados para cosas un poco más completas.

Método:
======

Código (=java) [Seleccionar]

public String getAcronimo() {
String siglas = "";
                // convierte un String a un array de char
                char[] asignaturaLetras = getNombre.toCharArray();

for (short i = 0; i < asignaturaLetras.length; i++) {
                        // le pasa una letra (char) y evalua si es mayuscula
if (Character.isUpperCase(asignatura[i])){
siglas += asignatura[i];
}

}
return siglas;
}



Saludos.


juanoide

Cita de: M1t$u en  6 Noviembre 2013, 23:00 PM
Tu idea de tu método está bien, pero tiene algunas fallas como:

Código (=java) [Seleccionar]

letra.isUpperCase(i)


El método isUpperCase si no me equivoco, acepta un parámetro char. Aquí le estás pasando un Integer.

Poner esto antes del for es redundante:

Código (=java) [Seleccionar]

Character letra = getNombre().charAt(0);


Esa instrucción solo la haces una vez en donde obtienes la primera letra de lo que devuelve getNombre(). Luego en el for recorres getNombre(), por lo que la sentencia anterior no tiene caso colocarla.

Para hacer más ordenado y simple el algoritmo, podemos hacer lo siguiente:

1) Obtener el nombre de la asignatura
2) Transformarlo a un array de char
3) Recorrer el array en busca de letras Mayúsculas
4) Si es mayúscula, se agrega al String que contendrá las siglas.
5) Devolver las siglas

Nota: No utilizo Character por que el método toCharArray() devuelve un array de char y no hay forma de hacer un cast de este array char a un array Character.

Otra cosa, para estos procesos sencillos utiliza tipos primitivos que se adapten al algoritmo, como son: short, byte, int, float, double, etc. Integer, Character, etc, son objetos y son usados para cosas un poco más completas.

Método:
======

Código (=java) [Seleccionar]

public String getAcronimo() {
String siglas = "";
                // convierte un String a un array de char
                char[] asignaturaLetras = getNombre.toCharArray();

for (short i = 0; i < asignaturaLetras.length; i++) {
                        // le pasa una letra (char) y evalua si es mayuscula
if (Character.isUpperCase(asignatura[i])){
siglas += asignatura[i];
}

}
return siglas;
}



Saludos.

hay una cosa que no pillo de tu codigo no seria asi:

Código (=java) [Seleccionar]

public String getAcronimo() {
String siglas = "";
                // convierte un String a un array de char
                char[] asignaturaLetras = getNombre.toCharArray();

for (short i = 0; i < asignaturaLetras.length; i++) {
                        // le pasa una letra (char) y evalua si es mayuscula
if (Character.isUpperCase(asignaturaLetras[i])){
siglas += asignaturaLetras[i];
}

}
return siglas;
}


y luego esto de :

Character.isUpperCase

no entiendo de donde sale Character

Mitsu

Hola,

Character es una Wrapper, en concreto del primitivo char. Una Wrapper es una clase/objeto de un tipo primitivo (int, char, byte, double, etc).

Una Wrapper o clase envoltorio, tiene métodos relacionados a su tipo primitivo que puedes usar, pero que no podrías usar con su primitivo. Por ejemplo, No puedo hacer esto:

Código (=java) [Seleccionar]

boolean isUpper = char.isUpperCase('A');


Por que char es un tipo primitivo, NO es una clase.

Por otro lado, generalmente no hay problemas en asignarle un int primitivo a un Integer, ni viceversa, ya que la JVM hace un autoboxing o unboxing, respectivamente.

El autoboxing consiste en convertir un primitivo a su objeto wrapper, y el unboxing, en convertir un objeto wrapper a su primitivo.


Saludos.