Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - RaGa

Páginas: 1 ... 7 8 9 10 11 [12]
221
Graves errores! (no se me pueden escapar cosas tan gruesas).
Veamos ahora si con los cambios en la clase Vehiculo y TestVehiculo queda solucionado.
No publico nuevamente la clase GestionadorEntradasTeclado ya que es la misma.
Gracias toni !

Clase Vehiculo
Código: [Seleccionar]
enum MarcaDeVehiculos {FORD,TOYOTA,SUZUKI,RENAULT,SEAT};

/** Clase Vehiculo. Cada objeto se compone de la marca del vehículo y su matrícula.
 * @author: RaGa
 * @date: 02/04/15
 * @version: 02
 */

public class Vehiculo{
    //Declaración de campos de instancia
    private String matricula;
    private MarcaDeVehiculos marca;
   
    public Vehiculo(){ // Constructor de clase
    }
   
    // Setters
    /**El método sirve para setear la marca del vehículo.
     * @param el parámetro valorMarca es de tipo int y corresponde a la marca del vehículo. Sus posibles opciones son:
     * 1 = FORD
     * 2 = TOYOTA
     * 3 = SUZUKI
     * 4 = RENAULT
     * 5 = SEAT
     */
    public void setMarca(int valorMarca){
       
        switch (valorMarca){
            case 1:
            marca = MarcaDeVehiculos.FORD;
            break;
            case 2:
            marca = MarcaDeVehiculos.TOYOTA;
            break;
            case 3:
            marca = MarcaDeVehiculos.SUZUKI;
            break;
            case 4:
            marca = MarcaDeVehiculos.RENAULT;
            break;
            case 5:
            marca = MarcaDeVehiculos.SEAT;
            break;
        } // fin Switch
    }
   
    /**El método sirve para setear la matrícula del vehículo.
     * @param el parámetro valorMatricula es de tipo String y corresponde a la matrícula del vehiculo.
     */
    public void setMatricula(String valorMatricula){
        matricula = valorMatricula;
    }
   
    // Getters
    /**El método devuelve la matrícula del vehículo.
     * @return la variable retornada es de tipo String.
     */
    public String getMatricula(){ return matricula; }
   
    /**El método devuelve la marca del vehículo.
     * @return la variable retornada es de tipo MarcaDeVehiculo.
     */
    public MarcaDeVehiculos getMarca(){ return marca; }
   
   
} //fin de la clase

Clase TestVehiculo
Código: [Seleccionar]
/** clase TestVehiculo. Sirve para poner a prueba la clase Vehiculo.
 * @author: RaGa
 * @date: 02/04/15
 * @version: 02
 */


public class TestVehiculo{
    //Declaración de campos de instancia vacía.
   
    public TestVehiculo(){ // Constructor de clase vacío.
    }
   
    /** Método main.
     * A través de la interface consola se establece comunicación con el usuario y se pone a prueba la clase Vehiculo.
     *
     */
    public static void main(String[] args){
       
        Vehiculo miVehiculo = new Vehiculo();
        int tmpMarca;
        boolean continuarEnWhile=true;
         
        System.out.println("\fBienvenido, a continuación se va a registrar su vehículo");
        System.out.println("");
       
        do{
            System.out.println("Por favor introduzca la marca según la siguiente Tabla: ");
            System.out.println("1. FORD");
            System.out.println("2. TOYOTA");
            System.out.println("3. SUZUKI");
            System.out.println("4. RENAULT");
            System.out.println("5. SEAT");
       
            tmpMarca = GestionadorEntradasTeclado.leerInt();
            if((0<tmpMarca)&&(tmpMarca<6)){continuarEnWhile=false; miVehiculo.setMarca(tmpMarca);}
            else{System.out.println("");
                 System.out.println("Su opción es erroena, por favor vuelva a intentarlo...");
                }
               
        }while(continuarEnWhile);

        System.out.println("");
        System.out.println("Por favor, ahora introduzca la Matrícula del vehículo: ");
        miVehiculo.setMatricula(GestionadorEntradasTeclado.leerString());
       
        System.out.println("\fSu vehículo quedó registrado como: ");
        System.out.print("Marca: "+miVehiculo.getMarca().toString()+"\n");
        System.out.print("Matricula: "+miVehiculo.getMatricula());
        System.out.println("");
        System.out.println("Gracias por registrar su vehículo. Hasta luego!");

    } // fin main
}// fin de la clase

Readme.txt
Citar
PROJECT TITLE: CU00681B
PURPOSE OF PROJECT: Probar la clase Vehiculo
VERSION or DATE: 02/04/15
HOW TO START THIS PROJECT: Ejecutar el método main de la clase TestVehiculo.
AUTHORS: RaGa
USER INSTRUCTIONS: Siga la instrucciones y mensajes que se presentan a través de la consola.

222
Mi versión del Ejercicio propuesto en la Entrega Nº81. Ejercicio CU00681B.

Clase Vehiculo
Código: [Seleccionar]
enum MarcaDeVehiculos {FORD,TOYOTA,SUZUKI,RENAULT,SEAT};

/** Clase Vehiculo. Cada objeto se compone de la marca del vehículo y su matrícula.
 * @author: RaGa
 * @date: 31/03/15
 * @version: 01
 */

public class Vehiculo{
    //Declaración de campos de instancia
    private String matricula;
    private MarcaDeVehiculos marca;
   
    public Vehiculo(){ // Constructor de clase
    }
   
    // Setters
    /**El método sirve para setear la matrícula y la marca del vehículo.
     * @param el parámetro valorMatricula es de tipo String y corresponde a la matrícula del vehiculo.
     * @param el parámetro opcionMarca es de tipo int y corresponde a la marca del vehículo. Sus posibles opciones son:
     * 1 = FORD
     * 2 = TOYOTA
     * 3 = SUZUKI
     * 4 = RENAULT
     * 5 = SEAT
     */
    public void setVehiculo(String valorMatricula, int opcionMarca){
        matricula = valorMatricula;
        switch (opcionMarca){
            case 1:
            marca = MarcaDeVehiculos.FORD;
            break;
            case 2:
            marca = MarcaDeVehiculos.TOYOTA;
            break;
            case 3:
            marca = MarcaDeVehiculos.SUZUKI;
            break;
            case 4:
            marca = MarcaDeVehiculos.RENAULT;
            break;
            case 5:
            marca = MarcaDeVehiculos.SEAT;
            break;
        } // fin Switch
    }
   
    // Getters
    /**El método retorna la matrícula del vehículo.
     * @return la variable retornada es de tipo String.
     */
    public String getMatricula(){ return matricula; }
    /**El método retorna la marca del vehículo.
     * @return la variable retornada es de tipo MarcaDeVehiculo.
     */
    public MarcaDeVehiculos getMarca(){ return marca; }
   
   
} //fin de la clase

Clase TestVehiculo
Código: [Seleccionar]
/** clase TestVehiculo. Sirve para poner a prueba la clase Vehiculo.
 * @author: RaGa
 * @date: 31/03/15
 * @version: 01
 */


public class TestVehiculo{
    //Declaración de campos de instancia.
    private Vehiculo miVehiculo;
    private int tmpMarca;
    private boolean continuarEnWhile=true;
   

    public TestVehiculo(){ // Constructor de clase vacío.
        miVehiculo = new Vehiculo();
    }
   
    /** Método ComprobadorVehiculo.
     * A través de la interface consola se establece comunicación con el usuario y se pone a prueba la clase Vehiculo.
     *
     */
   
    public void ComprobadorVehiculo(){
        System.out.println("\fBienvenido, a continuación se va a registrar su vehículo");
        System.out.println("");
       
        do{
            System.out.println("Por favor introduzca la marca según la siguiente Tabla: ");
            System.out.println("1. FORD");
            System.out.println("2. TOYOTA");
            System.out.println("3. SUZUKI");
            System.out.println("4. RENAULT");
            System.out.println("5. SEAT");
       
            tmpMarca = GestionadorEntradasTeclado.leerInt();
            if((0<tmpMarca)&&(tmpMarca<6)){continuarEnWhile=false;}
            else{System.out.println("");
                 System.out.println("Su opción es erroena, por favor vuelva a intentarlo...");
                }
               
        }while(continuarEnWhile);
       
        System.out.println("");
        System.out.println("Por favor, ahora introduzca la Matrícula del vehículo: ");
        miVehiculo.setVehiculo(GestionadorEntradasTeclado.leerString(),tmpMarca);
       
        System.out.println("\fSu vehículo quedó registrado como: ");
        System.out.print("Marca: "+miVehiculo.getMarca().toString()+"\n");
        System.out.print("Matricula: "+miVehiculo.getMatricula());
        System.out.println("");
        System.out.println("Gracias por registrar su vehículo. Hasta luego!");

    } // fin main
}// fin de la clase

Clase GestionadorEntradasTeclado
Código: [Seleccionar]
/**Clase de caracter public. Sirve para leer los valores ingresados por el usuario a través del teclado. Cuenta con dos métodos tipo función: uno devuelve un objeto tipo String ingresado por el usuario a través del teclado, y el otro devuelve un valor tipo int ingresado por el usuario a través del teclado.
 * @author: RaGa
 * @date: 15/03/15
 * @version: 01
 */

import java.util.Scanner;

public class GestionadorEntradasTeclado{
    //Declaracion de campos de instancia de la clase vacío.
   
    public GestionadorEntradasTeclado(){ // Constructor de clase vacío.
    }
   
    /**Devuelve un objeto tipo String correspondiente al valor ingresado por el usuario a través del teclado.
     * @return retorna un objeto tipo String.
     */
     static String leerString(){
        Scanner scannerTeclado = new Scanner (System.in);
        String valorTeclado = scannerTeclado.nextLine();
        return valorTeclado;
    }
   
    /**Devuelve un valor tipo int correspondiente al valor ingresado por el usuario a través del teclado.
    * @return retorna un valor tipo int.
    */
    static int leerInt(){
       Scanner scannerTeclado = new Scanner (System.in);
       int valorTeclado = scannerTeclado.nextInt();
       //String valorTmp = scannerTeclado.nextLine(); // para vaciar el buffer.
       return valorTeclado;
    }
     
} // Fin de la clase

Readme.txt
Citar
PROJECT TITLE: CU00681B
PURPOSE OF PROJECT: Probar la clase Vehiculo
VERSION or DATE: 31/03/15
HOW TO START THIS PROJECT: Instanciar un objeto tipo TestVehiculo y llamar al método ComprobadorVehiculo.
AUTHORS: RaGa
USER INSTRUCTIONS: Siga la instrucciones y mensajes que se presentan a través de la consola.

223
Mi versión del Ejercicio propuesto en la Entrega Nº80. Ejercicio CU00680B.

Clase MiniCalculadoraEjemplo
Código: [Seleccionar]
import java.lang.Math;
import java.util.Scanner;

/** Esta clase tiene métodos que le permiten realizar el ingreso de un valor tipo double a través del teclado por parte del usuario, y realizar dos operaciones matemáticas sobre ese valor.
 * @author: RaGa
 * @version: 01
 * @date:30/03/15
 */

public class MiniCalculadoraEjemplo{
    // Declaración de campos de instancia
    private double valorIngresado;
   
    public MiniCalculadoraEjemplo(){ // Constructor de clase
    }

   
    /** Lee el valor de tipo double que el usuario ingrese por teclado.
     * @return Retorna el valor tipo double ingresado por teclado por el usuario.
     */
    public double leerDouble(){
        Scanner scannerTeclado = new Scanner (System.in);
        double valorTeclado = scannerTeclado.nextDouble();
        String leerIntro = scannerTeclado.nextLine(); // sirve para borrar el intro del buffer
        return valorTeclado;
    }
   
    /** Calcula el valor absoluto del valor que se pasa como argumento.
     * @param Recibe como argumento un número tipo double.
     * @return Se retorna el valor absoluto del argumento de entrada.
     */
    public double calcularValorAbsoluto(double valor){
        return Math.abs(valor);
    }
   
   
    /** Calcula la raíz cuadrada del valor que se pasa como argumento.
     * @param Recibe como argumento un número tipo double.
     * @return Se retorna la raíz cuadrada del argumento de entrada.
     */
    public double calcularRaizCuadrada(double valor){
        return Math.sqrt(Math.abs(valor));
    }
   
} //fin de la clase

Clase TestMiniCalculadoraEjemplo
Código: [Seleccionar]
/**Esta clase sirve para probar la clase MiniCalculadoraEjemplo.
 * @author: RaGa
 * @version: 01
 * @date: 30/03/15
 */

public class TestMiniCalculadoraEjemplo{
    //Declaracion de campos de instancia de la clase
   
   
    public TestMiniCalculadoraEjemplo(){ // Constructor de clase
    }
   
    /**Este método sirve para probar todos los métodos de la clase MiniCalculadoraEjemplo mediante una interfaz con el usuario.
     *
     */
    public static void main(String[] args){
        MiniCalculadoraEjemplo calculadora = new MiniCalculadoraEjemplo();
        double valorIngresado;
       
        System.out.println("\fIngrese un valor numérico por favor:");
        System.out.println("");
        valorIngresado = calculadora.leerDouble();
        System.out.println("El valor absoluto de "+valorIngresado+" es "+calculadora.calcularValorAbsoluto(valorIngresado));
        System.out.println("Y su raíz cuadrada es "+calculadora.calcularRaizCuadrada(valorIngresado));
    }
   
     
} // Fin de la clase

README.TXT
Citar
PROJECT TITLE: Proyecto Documentación.
PURPOSE OF PROJECT: Este proyecto sirve para ejercitar la utilización de la documentación de Java.
VERSION or DATE: 30/03/15
HOW TO START THIS PROJECT: Ejecutar el método main de la Clase TestMiniCalculadoraEjemplo.
AUTHORS: RaGa
USER INSTRUCTIONS: Seguir las instrucciones y mensajes que aparecen por consola.


224
Perfecto, sigo adelante con esas premisas entonces. Muchas gracias.

225
Gracias Alex por venir en nuestro auxilio.
Perfecto entonces, y muy interesante lo que nos revelas acerca de los algoritmos de comprobación de tipos, es como mirar por la rendija la propia cocina del compilador.

Tengo una consulta que me surge respecto de lo que me sugieres cuando dices:

Citar
Otra cosa, esta declaración:

        ArrayList<Set> miLista; // Declaración de los objetos.
        HashSet<String> objHashSet;
        TreeSet<Integer> objTreeSet;


Es más adecuada así:

        List<Set> miLista; // Declaración de los objetos.
        Set<String> objHashSet;
        Set<Integer> objTreeSet;

Entiendo que iré captando y asimilando las bondades y beneficios del polimorfismo conforme vaya avanzando en las posteriores Lecciones y ejercitaciones, pero por lo pronto -y por las comprobaciones que realicé en virtud de tu sugerencia- puedo advertir algo y corrígeme si estoy equivocado.

Al declarar e instanciar el objeto miLista de la siguiente manera:

ArrayList<Set> miLista;
miLista = new ArrayList<Set>;

el objeto miLista podrá usar tanto los métodos correspondientes a la clase ArrayList, como los métodos correspondientes a la interface List, por ser la interface List implementada por la clase ArrayList, cierto?

Ahora bien, si en cambio el objeto miLista fuera declarado e instanciado de la siguiente manera:

List<Set> miLista;
miLista = new ArrayList<Set>;

el objeto miLista podrá usar solo los métodos de la interface Set, pero no los métodos de la clase ArrayList, cierto?.

¿Es correcto lo que digo? A simple vista sería como un "mal negocio" pero sospecho que los beneficios vienen por otro lado que por ahora no visualizo.
Hasta este momento veo como beneficio que un objeto declarado como List podrá recibir como argumento todo objeto cuya clase implemente la interface List (que no es poca cosa).

226
Muchas gracias toni por dedicarle tiempo y atención a mi codificación. Sinceramente te agradezco lo que me vienes ayudando.
Yendo a este ejercicio en sí, efectiviamente usé un iterador para recorrer cada elemento del ArrayList en el primer código que publiqué, dando cumplimiento a la consigna del ejercicio. Pero claro que con la salvedad de no especificar el tipo de elemento a recorrer, es la única forma que no aparezcan los Warnings. Y por eso mismo también me preguntaba cómo puedo darme cuenta que no es obligatorio declarar el <T> luego de leer la documentación del API: Interface Iterable<T>

Y respecto del segundo código: quise probar de resolver el problema con for each ya que tratándose de colecciones, es aplicable el uso de for each. De ahí que exponía en mi primera publicación de este hilo una esbozo de "posible explicación" de los sucedido.
Soy conciente de mi "rango de novato" y trato de sacar conclusiones de mis experiencias codificando varias veces los ejercicios, de las lecturas de las lecciones, y de los ejercicios y comentarios de los compañeros del foro. Pero recurro como ahora a los más exprimentados para saber si voy por buen camino (y no inventarme un Java de fantasía jeje).

227
Mis versiones del Ejercicio propuesto en la Entrega Nº78. Ejercicio CU00678B.

Presento dos códigos a los cuáles llegué luego de muchos tropiezos y muchas relecturas.


El primer código que compila sin Warnings es el siguiente:

Código: [Seleccionar]
import java.util.*;

public class Ejercicio_Polimorfismo{
    // Declaración de los campos de instancia.
    public Ejercicio_Polimorfismo(){ // Constructor de clase
    }
   
    public static void main (String[] args){
        ArrayList<Set> miLista; // Declaración de los objetos.
        HashSet<String> objHashSet;
        TreeSet<Integer> objTreeSet;
       
       
        miLista = new ArrayList<Set>(); // Instanciación de los objetos
        objHashSet = new HashSet<String>();
        objTreeSet = new TreeSet<Integer>();
       
       
        objHashSet.add("Sol"); // Añade elementos al objeto tipo HashSet
        objHashSet.add("Luna");
        objHashSet.add("Saturno");
       
        objTreeSet.add(2); // Añade elementos al objeto tipo TreeSet
        objTreeSet.add(8);
        objTreeSet.add(5);
               
        miLista.add(objHashSet); // Se agrega a la lista el objeto HashSet y el objeto TreeSet
        miLista.add(objTreeSet);

        System.out.print("\f"); // Borra la pantalla
       

        for (Set objetoSet:miLista){ // Se recorre el objeto ArrayList con for each
           
        Iterator itElementos = objetoSet.iterator(); // No se especifica tipo de dato a recorrer
       
            while(itElementos.hasNext()){ // Recorro cada elemento del ArrayList con un iterador
                System.out.println(itElementos.next());
            }
           
        } // fin for each
                     
       
    } // fin main
   
   
} // fin de la clase


En este segundo código aparecen los incómodos Warnings:

Código: [Seleccionar]
import java.util.*;

public class Ejercicio_Polimorfismo2{
    // Declaración de los campos de instancia.
    public Ejercicio_Polimorfismo2(){ // Constructor de clase
    }
   
    public static void main (String[] args){
        ArrayList<Set> miLista; // Declaración de los objetos.
        HashSet<String> objHashSet;
        TreeSet<Integer> objTreeSet;
       
       
        miLista = new ArrayList<Set>(); // Instanciación de los objetos
        objHashSet = new HashSet<String>();
        objTreeSet = new TreeSet<Integer>();
       
       
        objHashSet.add("Sol"); // Añade elementos al objeto tipo HashSet
        objHashSet.add("Luna");
        objHashSet.add("Saturno");
       
        objTreeSet.add(2); // Añade elementos al objeto tipo TreeSet
        objTreeSet.add(8);
        objTreeSet.add(5);
               
        miLista.add(objHashSet); // Se agrega a la lista el objeto HashSet y el objeto TreeSet
        miLista.add(objTreeSet);

        System.out.print("\f"); // Borra la pantalla
       

        for (Set objetoSet:miLista){ // Se recorre el objeto ArrayList con for each
               
            if(objetoSet instanceof HashSet){ // Si el elemento de la lista contiene un objeto HashSet lo recorro con un for each
                for (String tmp:(Set<String>)objetoSet){
                    System.out.println(tmp);
                }
            }
           
            if(objetoSet instanceof TreeSet){ // Si el elemento de la lista contiene un objeto TreeSet lo recorro con un for each
                for (Integer tmp:(Set<Integer>)objetoSet){
                    System.out.println(tmp);
                }
            }
 
                   
        } // fin for each
    } // fin main
} // fin de la clase

Saco como conclusión lo siguiente, y necesitaría ayuda para saber si estoy bien encaminado en las deducciones:

Primer código:

Se usa un for each para recorrer los objetos Set del ArrayList<Set>, y para recorrer esos objetos Set se usa un iterador donde no se especifica el tipo a recorrer. Este "truco" lo vi en un ejercicio del foro y sinceramente inquieta desde algún punto de vista: si bien uno se tranquiliza porque la compilación deja de darnos los warnings luego de machacarnos la cabeza varias horas seguidas, nos surge la inquietante idea de pensar ¿acaso hay cosas que se pueden hacer sin que estén documentadas en el Api de Java? Pues si uno consulta en el Api la interface Iterable:

Interface Iterable<T>

No hay ningún indicio de que <T> sea opcional, sino que interpreto que es obligatorio definir el tipo a recorrer. ¿Cómo se justifica entonces?


Segundo código:

Para el recorrido de los objetos Set se usa un for each, y para recorrer cada uno de esos objetos Set también se usa for each; vale decir que es un for each anidado dentro de otro for each, lo cual estaría bien desde el punto de vista que for each permite recorrer colecciones, y el tipo ArrayList implementa la interface Collection y interface Set tiene como superInterface la interface Collection. De esta manera justificaría poder usar for each en cada recorrido.

Ahora bien: aparecen los warnings. Si bien (yo) estoy seguro que no cometo ningún error de conversión de tipos, cada vez que extraigo del ArrayList<List> un objeto que yo estoy seguro que es un -supongamos- HashSet y lo quiero almacenar en un atributo de tipo HashSet, el compilador me lo va a advertir ya que él (el compilador) en tiempo de compilación no está seguro de que ese objeto Set que estoy extrayendo del ArrayList<List> en verdad sea un HashSet.

¿Es por eso que salta el warnings, verdad?

228
Muchas gracias por la sugerencia toni_apr. El cambio sugerido tiene a su vez implícito el hacerme notar el enfoque de POO que debemos ir incorporando creo.

Además: no solo el método mostrarLista(...) queda entonces incluído dentro de la clase ListaDeCantantesFamosos sino que a su vez me permite declarar al campo tipo ArrayList de esa clase como Private. Esto no lo había podido realizar de la manera en que lo había codificado yo. Mantener todos los campos de instancia declarados como privados de la clase (inaccecibles desde fuera) creo que también es una buena política, cierto?. Y que ellos sean solo modificables por los propios métodos de la clase.

Saludos!

229
Mi versión del Ejercicio propuesto en la Entrega Nº67. Ejercicio CU00667B.

clase CantanteFamoso
Código: [Seleccionar]
public class CantanteFamoso{
    // Declaración de los campos de instancia
    private String nombre;
    private String discoConMasVentas;
   
    public CantanteFamoso(){ // Constructor de clase vacio
    }

// SETTERS   
   
    public void setNombre(String valorNombre){
        nombre = valorNombre;
    }
   
    public void setDiscoConMasVentas (String valorDiscoConMasVentas){
        discoConMasVentas = valorDiscoConMasVentas;
    }
   
// GETTERS

    public String getNombre(){ return nombre; }
    public String getDiscoConMasVentas() { return discoConMasVentas; }
   
   
} // Fin de la clase

clase ListaCantantesFamosos
Código: [Seleccionar]
import java.util.ArrayList;


public class ListaCantantesFamosos{
   //Declaración de campos de instancia
   ArrayList<CantanteFamoso> listaCantantesFamosos;
   
   public ListaCantantesFamosos(){ //Constructor de clase
       listaCantantesFamosos = new ArrayList<CantanteFamoso>();
   }
   
   
   public void addListaCantante(CantanteFamoso valorCantante){ //Agrega un objeto CantanteFamoso a la Lista
       listaCantantesFamosos.add(valorCantante);
   }
   
   
} // fin de la clase

clase GestionadorEntradasTeclado
Código: [Seleccionar]
import java.util.Scanner;

public class GestionadorEntradasTeclado{
    //Declaracion de campos de instancia de la clase vacia
   
    public GestionadorEntradasTeclado(){ // Constructor de clase
    }
   
     static String leer(){
        Scanner scannerTeclado = new Scanner (System.in);
        String valorTeclado = scannerTeclado.nextLine();
        return valorTeclado;
    }
     
} // Fin de la clase

clase Test
Código: [Seleccionar]
import java.util.Iterator;

public class Test{
    //Declaración de campos de instancia vacío
 
   public Test(){ //Constructor de clase vacío
   }

   private static CantanteFamoso AgregarCantante(){ // Crea nuevo objeto CantanteFamoso de manera manual. Se devuelve el objeto.
       //Declaración de variables locales del método
       CantanteFamoso tmpCantanteFamoso;
       
       tmpCantanteFamoso = new CantanteFamoso(); // Instanciación del objeto CantanteFamoso
       
       System.out.println("");
       System.out.println("Ingrese Nombre del Cantante:");
       tmpCantanteFamoso.setNombre(GestionadorEntradasTeclado.leer());
       System.out.println("Ingrese su Disco con más ventas:");
       tmpCantanteFamoso.setDiscoConMasVentas(GestionadorEntradasTeclado.leer());
       return tmpCantanteFamoso;
   } // fin de método 
 
   
   private static void mostrarLista(ListaCantantesFamosos tmpLista){ // Muestra la Lista completa
       //Declaración de variables locales del método
       CantanteFamoso tmpCantante;
       Iterator<CantanteFamoso> it;
       it = tmpLista.listaCantantesFamosos.iterator();
       
       System.out.println("");
       while(it.hasNext()){
           tmpCantante = it.next();
           System.out.println("Nombre: "+tmpCantante.getNombre()+". Disco más vendido: "+tmpCantante.getDiscoConMasVentas());
       }
   }  // fin de método

   
    public static void main (String[] args){ // método main
        //Declaración de variables locales
        ListaCantantesFamosos listaOchentosa;
        CantanteFamoso tmpCantante;
        String respuesta;
           
        listaOchentosa = new ListaCantantesFamosos(); // Instanciación de la Lista
       
        tmpCantante = AgregarCantante(); // Creación del primer objeto CantanteFamoso
        listaOchentosa.addListaCantante(tmpCantante); // Agrego el primer objeto a la lista
        tmpCantante = AgregarCantante(); // Creación del segundo objeto CantanteFamoso
        listaOchentosa.addListaCantante(tmpCantante); // Agrego el segundo objeto a la lista
       
        System.out.println("");
        System.out.println("La lista inicial contiene los siguientes datos:"); // Mostrar la Lista inicial
        mostrarLista(listaOchentosa);
       
        do{
            tmpCantante = AgregarCantante(); // Creación de un nuevo objeto CantanteFamoso
            listaOchentosa.addListaCantante(tmpCantante); // Agrego el nuevo objeto a la Lista
            System.out.println("");
            System.out.println("La lista actualizada contiene los siguientes datos:"); // Mostrar la Lista actualizada
            mostrarLista(listaOchentosa);
           
            System.out.println("");
            System.out.println("Presione cualquier letra para agregar un nuevo Cantante a la Lista, o presione la letra \"N\" para salir.");
           
            respuesta = GestionadorEntradasTeclado.leer();
           
        }while(!respuesta.equalsIgnoreCase("n"));
       
        System.out.println("Gracias por usuar el software. Hasta luego!");   
   
    } // fin main
   
   
} // fin de la clase

Agradezco como siempre las correcciones y/o sugerencias. Muchas gracias.

230
Muy agradecido por tus sugerencias toni_apr.
Cometí el error de la mayúscula inicial al momento de instanciar el objeto (debo poner más atención al revisar la sintaxis).
Con respecto al Constructor_2, fue un error mío de interpretación de la consigna del ejercicio me parece. Totalmente de acuerdo contigo: el cambio que me recomiendas es mucho mas modular que lo que planteo yo con el Constructor_2. Creo que con el Constructor_1 basta, y luego con llamada a métodos desde la función main satisfago las necesidades del momento (como bien lo dices tu). De esa manera la clase ListaCantantesFamosos queda lista en un paquetito cerrado y bien modular para futuras necesidades.

Interpreté que cuando el enunciado del Ejercicio decía:

Citar
EJERCICIO
Crea una clase denominada ListaCantantesFamosos que al ser inicializada contenga un ArrayList con tres Strings que sean el nombre de cantantes famosos.

lo que estaba pidiendo era que al momento de la instancia en el Constructor se agregaran allí los 3 nombres de los cantantes.

Insisto, error mío de interpretación, un error tan importante como mal codificar pienso, ya que el primer paso a la hora de programar es interpretar correctamente el problema planteado para luego ir con nuestro arte.

Saludos.

231
Mi versión del Ejercicio propuesto en la Entrega Nº66. Ejercicio CU00666B.

Clase ListaCantantesFamosos
Código: [Seleccionar]
import java.util.ArrayList;

public class ListaCantantesFamosos{
    //Declaración de campos de instancia
    private ArrayList<String> listaCantantes;
   
    public ListaCantantesFamosos(){ // Constructor_1 de clase
        listaCantantes = new ArrayList<String>();
    }
   
        public ListaCantantesFamosos(String nombre1, String nombre2, String nombre3){ // Constructor_2 de clase
        listaCantantes = new ArrayList<String>();
        agregarCantante(nombre1);
        agregarCantante(nombre2);
        agregarCantante(nombre3);
    }
   
    public void agregarCantante(String nombre){
        listaCantantes.add(nombre);
    }
   
    public void recorrerListaCantante(){
    int i=1;
    for(String nombre : listaCantantes){
            System.out.println(i+".- "+nombre);
            i++;
        }
    }
   
} // Fin de la clase

Clase GestionadorEntradasTeclado
Código: [Seleccionar]
import java.util.Scanner;

public class GestionadorEntradasTeclado{
    //Declaracion de campos de instancia de la clase
   
    public GestionadorEntradasTeclado(){ // Constructor
    }
   
     static String leer(){
        Scanner scannerTeclado = new Scanner (System.in);
        String valorTeclado = scannerTeclado.nextLine();
        return valorTeclado;
    }
     
} // Fin de la clase

Clase Test
Código: [Seleccionar]
import java.util.ArrayList;

public class Test{
    //Declaración de campos de instancia.
   
    public static void main (String[] args){
        ListaCantantesFamosos CantantesItalianos;
        CantantesItalianos = new ListaCantantesFamosos("Eros Ramazzotti","Adriano Celentano","Lucio Dalla");
       
        System.out.println("Cantantes Italianos Famosos incluídos en la Lista:");
        CantantesItalianos.recorrerListaCantante();

       
    do{
        System.out.println("");
        System.out.println("Agregue un nuevo cantante italiano a la Lista:");
        CantantesItalianos.agregarCantante(GestionadorEntradasTeclado.leer());
       
        System.out.println("");
        System.out.println("Cantantes Italianos Famosos incluídos en la Lista:");
        CantantesItalianos.recorrerListaCantante();
       
        System.out.println("");
        System.out.println("¿Desea agregar un nuevo cantante a la Lista?");
        System.out.println("(Presione letra \"Y\" para agregar, cualquier otra tecla para Salir)");
    }while (GestionadorEntradasTeclado.leer().equalsIgnoreCase("y"));
   
    System.out.println("");
    System.out.println("Fin del programa. Muchas gracias");       
       
    } // fin main
   
} // fin clase

Saludos!

232
Correcto, entiendo lo que dices.
A lo que me refería es que el campo "in" de la clase System también podría (así en potencial) referenciar, apuntar, a otra entrada que no sea teclado si es que fuese necesario, usando el método setIn de la clase System:

setIn(InputStream in)
Reassigns the "standard" input stream.

método que reasigna cuál será la entrada estandar.

Más que nada mi intención era ir aprendiendo el manejo y la interpretación de la documentación del API. Entender que el objeto in además de ser un campo correspondiente a un clase donde utilizamos sus métodos, también lo pensemos como una Referencia, un "apuntar hacia".

Por eso de la misma manera, otra sentencia que hemos venido utilizando con frecuencia referido a la consola es:

Código: [Seleccionar]
System.out.println(“aprenderaprogramar”);

Como en esta Entrega Nº57 empezamos a investigar la documentación del API, empezando a relacionar los conceptos, podemos ver que:
La clase System tiene 3 campos de clase de distinto tipo:

PrintStream err
InputStream in
PrintStream out

"out" es un campo de clase PrintStream, por eso puedo utilizar todos los métodos de los objetos PrintStream. Entre ellos encontramos print y println (que ya hemos utilizado).

Podemos definir un objeto PrintStream y utilizar sus métodos. Supongamos que creamos un objeto PrintStream y utilizamos el método println. La salida no va a salir por consola.
¿por qué?, supongo que será porque al escribir la sentencia:

Código: [Seleccionar]
System.out.println(“aprenderaprogramar”);
el objeto "out", además de ser un objeto de la clase PrintStream, REFERENCIA, apunta al espacio de memoria que corresponde a los datos que el sistema luego enviará a la pantalla.

Y al igual que señalábamos anteriormente con el campo "in" ¿Y si quisiera por x motivos que el campo "out" APUNTARA hacia otro lugar que no fuese la consola? entonces cambio la referencia estandar de salida de out ¿de qué manera? con un método de la clase System:

setOut(PrintStream out)
Reassigns the "standard" output stream

que reasigna la salida estandar.

233
Leyendo el tutorial CU00657B., me surgen preguntas que intento ir dilucidando retrocediendo en las lecciones y consultado la documentación del API de Java.

Cuando en el ejemplo se instancia un objeto de la siguiente manera:

Scanner entradaEscaner = new Scanner (System.in);    (1)

Interpreto lo siguiente (según voy hurgando en las API de Java)

“in” es un campo de la clase System.
“in” es un objeto de la clase InputStream.

Siguiendo con la lectura de las API de Java, cuando entramos en la clase Scanner vemos que hay Constructores sobrecargados. De todas las posibilidades, vemos que la que se ajusta a nuestra instrucción (1) es:

Scanner(InputStream source)

Es decir que espera como parámetro un objeto de la clase InputStream. Por ello le enviamos como parámetro el objeto “in” (de la clase System).

Ahora bien ¿cuál es la magia que hace que “in” esté prestando atención a lo que sucede en el teclado? Lo que creo es que en este caso, más que mirar a “in” como un objeto con  métodos, tenemos que pensarlo como una referencia, un “apuntar hacia”.

Cuando instanciábamos en los ejercicios anteriores un objeto al que llamábamos “taxi1” de la clase Taxi, bastaba solamente con que la referencia “taxi1” apuntara a ese espacio de memoria donde la información de taxi1 se guardaría. Y ese espacio de memoria daba igual si se reservara al comienzo de la memoria, al medio, o al final de la misma. Siempre que “taxi1” referenciara a ese lugar, cualquiera fuera él, nos bastaba.
En el caso del objeto “in”, creo que ese lugar al que referencia, ese lugar al que apunta, SI IMPORTA.

No tenemos acceso al código de la clase System, pero intuyo que si está configurada que la “entrada estándar” sea el teclado, asigna como referencia de “in” el lugar a donde llega lo que entra por teclado (por así decirlo). Si luego se cambia la entrada estándar, y la nueva entrada estándar es un archivo (supongamos), entonces “in” apuntará a ese archivo.

¿Son correctas estas ideas?.

234
Buenas tardes.

Este es mi primera participación activa en el foro.

Vengo leyendo todas las Entregas y haciendo los Ejercicios propuestos.

Gracias al foro he podido ir comparando (y aprendiendo) con los programas que se comparten; lo mismo con las observaciones que se hacen sobre ellos.

Este es mi versión para el Ejercicio de la Entrega Nº62 (CU00662B).

Código: [Seleccionar]

public class CU00662B{ // Definición de clase
    //Declaracion de campos de instancia vacía

    public static void main (String[] args){ // función main
        System.out.print("Ingrese Primera Palabra :");
        String palabra1 = Teclado.leer();
        System.out.print("Ingrese Segunda Palabra :");
        String palabra2 = Teclado.leer();
        System.out.println("");
       
        int limiteSuperior;
        int limiteInferior;
        int palabraCorta;
       
        if(palabra1.length() < palabra2.length()){
            limiteInferior = palabra1.length();
            palabraCorta = 1;
            limiteSuperior = palabra2.length();}
            else
            {limiteInferior = palabra2.length();
             palabraCorta = 2;
             limiteSuperior = palabra1.length();}
           
        for (int i=0;i<limiteSuperior;i++){
           
            if (i<limiteInferior){
                System.out.print("¿Letra "+(i+1)+" igual en las dos palabras? ");
                System.out.print(palabra1.substring(i,i+1).equals(palabra2.substring(i,i+1))+"\n");
            }
            else{
                System.out.print("La palabra "+palabraCorta+" no tiene letra "+(i+1)+"\n");
            }
           
        } // fin bucle for
                       
    } // fin main
   
} // fin clase

El método que sirve para ingresar los datos por teclado está en otro clase.

Mi intención además de intentar "pensar en POO" persigue el objetivo de la eficiencia.

Creería que de esta manera, es decir que el objeto Scanner sea local de un método, ahorra recursos ya que una vez que devuelve el String deja de existir. No sucedería lo mismo si la instanciación del objeto Scanner se hiciera dentro del main.

¿Son correctas estas apreciaciones?

Código: [Seleccionar]
import java.util.Scanner;

public class Teclado{
    //Declaracion de campos de instancia de la clase
    public Teclado(){
    }
   
     static String leer(){
        Scanner scannerTeclado = new Scanner (System.in);
        String valorTeclado = scannerTeclado.nextLine();
        return valorTeclado;
    }
   
       
} // Fin de la clase

Páginas: 1 ... 7 8 9 10 11 [12]

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".