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.


Temas - RaGa

Páginas: [1]
1
Hola.

Estuve analizando el ejercicio resuelto de la entrega CU00921C. Probándolo con algunos cambios obtuve resultados no satisfactorios cuyos motivos no logro explicar. Quisiera compartir esa experiencia.

Vamos al código:
La clase Programa tal como está en la entrega funciona correctamente. Los tiempos que aparecen por consola irán variando dependiendo de, no solo qué procesador uno tenga, si no también de "qué tan ocupado" esté el procesador al momento de ejecutarse el programa. Lo importante de ver en cada corrida del programa es la diferencia relativa de tiempos.

Ahora bien, supongamos que introducimos una modificación de orden al programa original.
Supongamos que la modificación consiste en: primero realizar la inserción de un elemento en la posición 0 de la lista listalinked, y luego la insersión de un objeto en posición 0 en la lista listaarray. Es decir, en vez de realizar primero la inserción en listaarray como lo hacía el programa original, empezamos por insertar en la lista listalinked.

Lo que uno esperaría es que los tiempos mantuvieran la misma diferencia relativa, pero no sucede así.
El programa codificado de esta manera muestra que la insersión en la lista listalinked será  incluso hasta más lenta que en la lista listaarray.
Esto es lo que causa sorpresa. Uno hubiera esperado se mantuviera la diferencia relativa de tiempos insumidos por los procesos, y que principalmente el tiempo insumido por listalinked fuese menor que el tiempo insumido por listaarray.

Presumo tal vez que este comportamiento observado esté relacionado con otro tipo de cuestiones (externas) más que a la perfomance de los 2 tipos de implimentaciones analizadas (ArrayList y LinkedList).

(La siguiente es la clase modificada con el cambio ya explicado)
Código: [Seleccionar]
/* Ejemplo Interface List aprenderaprogramar.com */

import java.util.ArrayList;

import java.util.LinkedList;

import java.util.List;

 

public class Programa {

    public static void main(String arg[]) {

            List<Persona> listaarray = new ArrayList<Persona>();

            List<Persona> listalinked = new LinkedList<Persona>();

            long antes;

            for(int i=0;i<10000;i++)

            {

               listaarray.add(new Persona(i,"Persona"+i,i));  // En este ejemplo cada persona lleva datos ficticios

                listalinked.add(new Persona(i,"Persona"+i,i));

            }

            System.out.println("Tiempo invertido en insertar una persona en listalinked (en nanosegundos):");

            antes = System.nanoTime();

            listalinked.add(0,new Persona(10001,"Prueba",10001)); // Inserción en posicion 0 de una persona

            System.out.println(System.nanoTime()- antes);

            System.out.println("Tiempo invertido en insertar una persona en listaarray (en nanosegundos):");

            antes = System.nanoTime();

            listaarray.add(0,new Persona(10001,"Prueba",10001));  // Inserción en posicion 0 de una persona

            System.out.println(System.nanoTime()- antes);

      }

}

2
Mi consulta es sobre cómo debo leer (interpretar) la información del API.
En este caso analicemos los dos métodos utilizados en el ejemplo resuelto, los cuales  pertenecen a la clase Collections.

Analicemos el siguiente método:

static <T extends Comparable<? super T>> void       sort(List<T> list)

Lo que entiendo de este método es que:
el método es un método estático tipo procedimiento (no devuelve nada).
Es aplicable sobre objetos tipo T, los que implementan la interface Comparable (o heredan una clase que la implemente).
Y que a su vez esa interface Comparable está definida sobre objetos que heredan la clase T.
El parámetro que se debe pasar al método es un objeto tipo List definido sobre objetos tipo T.

¿ Esto es correcto ?

Analizando la información del API de este otro método:

static <T> void              sort(List<T> list, Comparator<? super T> c)

entiendo que: es una método estático tipo procedimiento también.
Los parámetros que se deben pasar al método son dos:
El primero, un objeto tipo List definido sobre objetos tipo T.
El segundo, un objeto tipo Comparator definido sobre objetos que hereden la clase T.

¿ Esto es correcto ?

3
Hola, respecto de la Entrega Nº912 del curso, me gustaría hacer un aporte y una consulta:


Aporte:

El ejercicio resulto de la entega da un Warning cuando uno compila la clase ConjuntoPersonas.
Esta advertencia deja de aparecer si hacemos el siguiente cambio en el método iterator()

Código: [Seleccionar]
public Iterator<Persona> iterator() {   
        Iterator it = new MiIteratorPersona();
        return it;         
    }

por:

Código: [Seleccionar]
public Iterator<Persona> iterator() {
        Iterator<Persona> it = new MiIteratorPersona();
        return it;         
    }

Consulta:

En un párrafo de la entrega se dice:

Citar
Piensa que un iterador viene siendo “un clon” de la colección a recorrer. Es decir, en vez de operar directamente sobre la colección original operamos sobre una copia.

¿ Cuando se dice colección, a qué se refiere ? Porque si se refiere a lo que veníamos llamando colección: un vector, un ArrayList, un LinkedList, cualquier tipo List, etc. entonces por la forma en que vemos está implementada la interface Iterable, me da la sensación que no sería tan así, no es que "en vez de operar directamente sobre la colección original operamos sobre una copia."
Diría más bien que se crea un objeto distinto, pero que al fin y al cabo referencia a la misma coleccion (en el caso del ejemplo resuelto un vector) perteneciente a la clase sobre la cual se implementa la interface Iterable.

No estaríamos creando un "copia de la colección" en donde operar, que ahí si podríamos creo hablar de un clon de la colección.
En este caso sería tener un nuevo objeto (el iterador) que referencia a la colección del objeto cuyo tipo implementa la interface Iterable, pero la colección siempre es la misma (el vector).

¿ Estoy en lo correcto ?


4
Hola!

Me ha quedado una duda al leer la lección (CU00910C) donde se desarrolla un ejemplo resuelto implementando la interface Cloneable, perteneciente al package lang del API Java.

Supongamos que al ejemplo lo reescribo de la siguiente manera:

Código: [Seleccionar]
Por ejemplo, si al código del ejercicio resuelto, lo reescribiéramos de la forma:

/* Ejemplo Clase e Interfaz Cloneable aprenderaprogramar.com */

 public class Persona implements Cloneable{

   public int dni, edad;

      public Persona( int d, int e) {     this.dni = d;       this.edad = e;     }

 }

no tendríamos errores de compilación, ¿ por qué ? porque la interface Clonable no declara ningún método abstracto, por lo tanto no me obliga a implementar ninguno en mi clase concreta. ¿Pero y entonces de dónde sale el método clone() ? El método clone() es un método heredado de la clase Object. Pero al no estar declarado en la Interface clonable() no estoy obligado a implementarlo.

Lo que no entiendo es: si el API de java, define una interface clonable() para que la utilicemos para clonar, ¿por qué no entonces declarar la clase abstracta clone()? ¿por qué no exigir al que implemente la interface que es obligatoria su implementación?

5
Mi versión del Ejercicio propuesto en la Entrega Nº97. Ejercicio CU00697B.

Citar
Se plantea desarrollar un programa Java que permita representar la siguiente situación. Una instalación deportiva es un recinto delimitado donde se practican deportes, en Java interesa disponer de un método int getTipoDeInstalacion(). Un edificio es una construcción cubierta y en Java interesa disponer de un método double getSuperficieEdificio(). Un polideportivo es al mismo tiempo una instalación deportiva y un edificio; en Java interesa conocer la superficie que tiene y el nombre que tiene. Un edificio de oficinas es un edificio; en Java interesa conocer el número de oficinas que tiene.

Definir dos interfaces y una clase que implemente ambas interfaces para representar la situación anterior. En una clase test con el método main, crear un ArrayList que contenga tres polideportivos y dos edificios de oficinas y utilizando un iterator, recorrer la colección y mostrar los atributos de cada elemento. ¿Entre qué clases existe una relación que se asemeja a la herencia múltiple?

Interface InstalacionDeportiva

Código: [Seleccionar]
public interface InstalacionDeportiva{
    /**
     * método getTipoDeInstalacion
     *
     * @return devuelve el tipo de instalacion segun la siguiente codificación:
     *
     * 0 = Instalacion deportiva de tipo abierta al público.
     * 1 = Instalacion deportiva de tipo escolar.
     * 2 = Instalacion deportiva de tipo exclusiva para socios.
     * 3 = Instalacion deportiva de tipo sindical.
     */
    int getTipoDeInstalacion();
}


Interface Edificio

Código: [Seleccionar]
public interface Edificio{
    /**
     * método getSuperficieEdificio
     *
     * @return retorna la superficie del edificio
     */
    double getSuperficieEdificio();
}


Clase Polideportivo

Código: [Seleccionar]
public class Polideportivo implements InstalacionDeportiva,Edificio{
    // Declaración de variables de instancia.
    private String nombre;
    private int tipoDeInstalacion;
    private double superficieEdificio;

    /**
     * Constructor de la clase Polideportivo
     */
    public Polideportivo(String nombre, int tipoDeInstalacion, double superficieEdificio){
        this.nombre = nombre;
        this.tipoDeInstalacion = tipoDeInstalacion;
        this.superficieEdificio = superficieEdificio;
    }

    /**
     * Setters
     */
    public void setTipoDeInstalacion(int tipoDeInstalacion){
        this.tipoDeInstalacion = tipoDeInstalacion;
    }

    public void setSuperficieEdificio(double superficieEdificio){
        this.superficieEdificio = superficieEdificio;
    }
   
    public void setNombre(String nombre){
        this.nombre = nombre;
    }
       
    /**
     * Getters
     */
   
    @Override
    public int getTipoDeInstalacion(){
        return tipoDeInstalacion;
    }
   
    @Override
    public double getSuperficieEdificio(){
        return superficieEdificio;
    }
   
    public String getNombre(){
        return nombre;
    }
   
    /**
     * Otros métodos
     */
   
    @Override
    public String toString(){
        String aux="";
        switch (tipoDeInstalacion){
                    case 0:
                        aux="abierta al público";
                        break;
                    case 1:
                        aux="escolar";
                        break;
                    case 2:
                        aux="exclusiva para socios";
                        break;
                    case 3:
                        aux="sindical";
                        break;
                }
        return "Polideportivo "+nombre+", de tipo "+aux+", cuenta con una superficie de "+superficieEdificio+" m2.";
    }

} // fin de la clase


Clase EdificioDeOficinas

Código: [Seleccionar]
public class EdificioDeOficinas implements Edificio{
    // Declaracion de campos de instancia.
    private double superficieEdificio;
    private int numeroDeOficinas;

    /**
     * Constructor de clase EdificioDeOficinas
     */
    public EdificioDeOficinas(double superficieEdificio, int numeroDeOficinas){
        this.superficieEdificio = superficieEdificio;
        this.numeroDeOficinas = numeroDeOficinas;
    }

    /**
     * Setters
     */
    public void setSuperficieEdificio(double superficieEdificio){
        this.superficieEdificio = superficieEdificio;
    }
   
    public void setNumeroDeOficinas(int numeroDeOficinas){
        this.numeroDeOficinas = numeroDeOficinas;
    }
   
    /**
     * Getters
     */
   
    @Override
    public double getSuperficieEdificio(){
        return superficieEdificio;
    }
   
    public int getNumeroDeOficinas(){
        return numeroDeOficinas;
    }
   
    /**
     * Otros métodos
     */
   
    @Override
    public String toString(){
        return "Edificio de "+numeroDeOficinas+" oficinas, con una superficie de "+superficieEdificio+" m2.";
    }
   
} // fin de la clase


Clase Test2

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

public class Test2{
    // Declaración de campos de instancia vacía.

    /**
     * Constructor de clase Test2
     */
    public Test2(){ // vacío
    }

    /**
     * método main
     */
    public static void main(String[] args){
        //Declaración de campos de clase.
       
        List<Edificio> miLista = new ArrayList<Edificio>();
       
        // creación de objetos
        miLista.add(new Polideportivo("Juventud Unida",3,2000d));
        miLista.add(new Polideportivo("Club Atlético Universitario",1,3500d));
        miLista.add(new Polideportivo("Gimnasia y Esgrima",0,1800d));

        miLista.add(new EdificioDeOficinas(200d,20));
        miLista.add(new EdificioDeOficinas(500d,34));

        // recorrido de la lista.
       
        System.out.println("\fEdificios contenidos en la lista");
        System.out.println("---------------------------------");
        System.out.println("\n");
       
        Iterator it = miLista.iterator();

        while(it.hasNext()){
            System.out.println(it.next().toString()+"\n");
        }// fin de while       
       
    } // fin de método main
   
} // fin de clase

6
Mi versión del Ejercicio propuesto en la Entrega Nº95. Ejercicio CU00695B.
(para descargar pulsar en el icono de archivo estando logeado en el foro)

7
Mi versión del Ejercicio propuesto en la Entrega Nº94. Ejercicio CU00694B.

Citar
Define una clase Figura de la que hereden otras dos clases denominadas Cuadrado y Círculo. La clase figura debe tener al menos el campo dimensionPrincipal. Las clases Cuadrado y Círculo deben tener al menos un método calcularArea que permita calcular el área a partir de la dimensión principal, utilizando la fórmula matemática correspondiente. Además, sobreescribe el método equals para que dos cuadrados sean iguales si tienen igual dimensión principal, y dos círculos idem. A continuación crea un programa test donde crees varios círculos y cuadrados y hagas comprobaciones de igualdad usando el método equals.

Clase Figura
Código: [Seleccionar]
/**
 * Clase Figura
 *
 * @author (RaGa)
 * @version (20150428)
 */
public class Figura{
    // Declaración de campos de instancia.
    protected double dimensionPrincipal;

    /**
     * Constructor de clase
     */
    public Figura(double dimensionPrincipal){
        this.dimensionPrincipal=dimensionPrincipal;
    }

    /**
     * setters
     */
    public void setDimensionPrincipal(double dimensionPrincipal){
        this.dimensionPrincipal=dimensionPrincipal;
    }
   
    /**
     * getters
     */
    public double getDimensionPrincipal(){
        return dimensionPrincipal;
    }
   
    /**
     * método equals
     */
    public boolean equals(Object obj){
        if(obj instanceof Figura){
            Figura tmp=(Figura)obj;
            if(this.dimensionPrincipal==tmp.dimensionPrincipal){
                return true;
            }
            else{return false;}
        }
        else{return false;}
    }
   
   
} // fin de la clase

Clase Cuadrado
Código: [Seleccionar]
/**
 * Clase Cuadrado
 *
 * @author (RaGa)
 * @version (20150428)
 */
public class Cuadrado extends Figura{
    // Declaración de campos de instancia

    /**
     * Constructor de clase
     */
    public Cuadrado(int dimensionPrincipal){
        super(dimensionPrincipal);
    }

    /**
     * método calcularArea
     */
    public double calcularArea(){
        return (Math.pow(dimensionPrincipal,2));
    }
   
    /**
     * método equals
     */
   
    @Override
    public boolean equals(Object obj){
        if(obj instanceof Cuadrado){
            return super.equals(obj);
        }
        else{return false;}
    }

Clase Circulo
Código: [Seleccionar]
/**
 * Clase Circulo
 *
 * @author (RaGa)
 * @version (20150428)
 */
public class Circulo extends Figura{
    // Declaración de campos vacía

    /**
     * Constructor de clase
     */
    public Circulo(int dimensionPrincipal){
        super(dimensionPrincipal);
    }

    /**
     * método calcularArea
     */
    public double calcularArea(){
        return (Math.PI*Math.pow(dimensionPrincipal,2));
    }
   
    /**
     * método equals
     */
   
    @Override
    public boolean equals(Object obj){
        if(obj instanceof Circulo){
            return super.equals(obj);
        }
        else{return false;}
    }
       

   
} // fin de la clase

Clase TestFigura
Código: [Seleccionar]
/**
 * Clase TestFigura
 *
 * @author (RaGa)
 * @version (20150428)
 */
public class TestFigura{
    // Declaración de campos de clase vacía
 
    /**
     * Constructor de clase vacío
     */
    public TestFigura(){
    }

    /**
     * método main
     */
    public static void main(String[] args){
       
        // Creacion de los objetos
        Figura cuadrado1 = new Cuadrado(5);
        Figura cuadrado2 = new Cuadrado(8);
        Figura cuadrado3 = new Cuadrado(5);
       
        Figura circulo1 = new Circulo(7);
        Figura circulo2 = new Circulo(8);
        Figura circulo3 = new Circulo(7);
       
        // Comparación de objetos
        System.out.println("\fCOMPARACION ENTRE CUADRADOS");
        System.out.println("¿Es cuadrado1 igual a cuadrado2? "+cuadrado1.equals(cuadrado2));
        System.out.println("¿Es cuadrado1 igual a cuadrado3? "+cuadrado1.equals(cuadrado3));
        System.out.println("¿Es cuadrado2 igual a cuadrado3? "+cuadrado2.equals(cuadrado3));
        System.out.println("");
        System.out.println("COMPARACION ENTRE CÍRCULOS");
        System.out.println("¿Es circulo1 igual a circulo2? "+circulo1.equals(circulo2));
        System.out.println("¿Es circulo1 igual a circulo3? "+circulo1.equals(circulo3));
        System.out.println("¿Es circulo2 igual a circulo3? "+circulo2.equals(circulo3));
        System.out.println("");
        System.out.println("COMPARACION ENTRE UN CUADRADO Y UN CÍRCULO DE IGUAL DIMENSION PRINCIPAL");
        System.out.println("¿Es circulo2 igual a cuadrado2? "+circulo1.equals(cuadrado2));
       
    } // fin del main
       

   
} // fin de la clase

Se sobreescribió el método equals en la clase Figura, en la clase Cuadrado y en la clase Circulo.

La justificación es por motivos de modularidad y posible expansión en el futuro.

La clase Figura tiene un solo campo y es el que se compara en el método equals correspendiente a esta clase.

Si en el futuro se ampliara la cantidad de campos de la clase Figura y se  estableciera como criterio de igualdad para todos los objetos Figura (además del campo dimensión principal) que fuera necesaria la igualdad de algún otro campo, dicha comparación se incluiría en esta clase.

De esta manera, no se repetiría código en cada una de las subclases que pudiera tener la clase Figura.

A su vez, cada subtipo sobreescribe el método equals lo cual les  permite:

*) Primero establecer si lo que se están comparando son figuras del mismo tipo.
Si no estableciéramos esta comparación previa y solo usáramos el método equals de la superclase, obtendríamos un 'true' si comparamos un cuadrado y un círculo con la misma valor de campo dimension principal.

*) Cada método sobreescrito equals de cada subclase llama al método equals de la superclase para comprobar si cumple todos los requisitos de igualdad de la superclase Figura. (Hoy es un solo criterio, pero pueden ser muchos).

*) Pero además es necesario que cada subclase sobreescriba el método equals para poder establecer (en un futuro) criterios de igualdad que no son comunes a todos los objetos tipo Figura.

Por ejemplo: si en una posible ampliación de código, la clase Figura incorporara el campo 'color', y el criterio de color no fuera una condicion de igualdad para la clase Cuadrado pero sí para los objetos tipo Circulo, estableceríamos esa comparación del color en el método equals de la clase Circulo.


8
Mi versión del Ejercicio propuesto en la Entrega Nº92. Ejercicio CU00692B.

Clase Profesor
Código: [Seleccionar]
/**
 * Clase Profesor
 *
 * @author (RaGa)
 * @version (20150427)
 */
public class Profesor
{
    // Declaración de campos de instancia.
    private String nombre;
    private int edad;
    private int añosConsolidados;

    /**
     * Constructor 1 para objetos de clase Profesor
     */
    public Profesor(String nombre, int edad, int añosConsolidados){
        this.nombre=nombre;
        this.edad=edad;
        this.añosConsolidados=añosConsolidados;
    }
   
    /**
     * Constructor 2 para objetos de clase Profesor
     */
    public Profesor(){
        nombre="";
        edad=0;
        añosConsolidados=0;
    }

    /**
     * métodos setters
     */
   
    public void setAñosConsolidados(int añosConsolidados){
        this.añosConsolidados=añosConsolidados;
    }
   
    public void setNombre(String nombre){
        this.nombre=nombre;
    }
   
    public void setEdad(int edad){
        this.edad=edad;
    }
   
    /**
     * métodos getters
     */
   
    public int getAñosConsolidados(){
        return añosConsolidados;
    }
   
    public String getNombre(){
        return nombre;
    }
   
    public int getEdad(){
        return edad;
    }
   
    /**
     * métodos varios
     */
   
    public String mostrarDatos(){
        return ("\nNombre: "+nombre+", Edad: "+edad+", Años Consolidados: "+añosConsolidados+", ");
    }
   
    public double obtenerSalarioBase(){
        return (725+(añosConsolidados*33.25));
    }
   
}// fin de la clase

Clase ProfesorEmerito
Código: [Seleccionar]
/**
 * Clase ProfesorEmerito
 *
 * @author (RaGa)
 * @version (20150427)
 */
public class ProfesorEmerito extends Profesor
{
    // Declaración de campos de instancia.
    private int añosEmerito;

    /**
     * Constructor 1 para objetos de clase ProfesorEmerito
     */
    public ProfesorEmerito(String nombre, int edad, int añosConsolidados, int añosEmerito){
        super(nombre,edad,añosConsolidados);
        this.añosEmerito=añosEmerito;
    }
   
    /**
     * Constructor 2 para objetos de clase ProfesorEmerito
     */
    public ProfesorEmerito(int añosEmerito){
        super();
        añosEmerito=añosEmerito;
    }

    /**
     * métodos setters
     */
   
    public void setAñosEmerito(int añosEmerito){
        this.añosEmerito=añosEmerito;
    }
   
    /**
     * métodos getters
     */
   
    public int getAñosEmerito(){
        return añosEmerito;
    }

   
    /**
     * métodos varios
     */
   
    public String mostrarDatos(){
        return (super.mostrarDatos()+" Años Emérito: "+añosEmerito+", ");
    }
   
    public double obtenerSalarioBase(){
        return (super.obtenerSalarioBase()+(47.80*añosEmerito));
    }
   
}// fin de la clase

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

/**
 * Clase TestHerencia6
 *
 * @author (RaGa)
 * @version (20150427)
 */
public class TestHerencia6
{
    // Declaracion de variables de instancia.
   

    /**
     * Constructor de clase
     */
    public TestHerencia6(){ //vacío
    }

    /**
     * método main
     */
    public static void main(){
        ArrayList<Profesor> listaProfesoresAcademia;
        listaProfesoresAcademia=new ArrayList<Profesor>();
       
        // Carga de datos de Profesores
        Profesor profe1 = new Profesor("Danilo Salazar Quintana",28,2);
        Profesor profe2 = new ProfesorEmerito("Cándido Tolosa Martínez",63,28,3);
        ProfesorEmerito profe3 = new ProfesorEmerito("María Rosa Díaz Díaz",60,27,2);
       
        // Carga de ListaProfesoresAcademia
        listaProfesoresAcademia.add(profe1);
        listaProfesoresAcademia.add(profe2);
        listaProfesoresAcademia.add(profe3);
       
        // Muestra de ListaProfesoresAcademia
        System.out.println("\fLista de Profesores de la Academia");
        for (Profesor tmp:listaProfesoresAcademia){
            System.out.println(tmp.mostrarDatos());
            System.out.println("Salario Base= "+tmp.obtenerSalarioBase());
        }
       
    }// fin de main
   
}// fin de clase

9
Mi versión del Ejercicio propuesto en la Entrega Nº88. Ejercicio CU00688B.

He ampliado un poco más el ejercicio respecto de lo que se pedía. Espero sea aceptada esta licencia que me he tomado.  :)

10
Mi versión del Ejercicio propuesto en la Entrega Nº87. Ejercicio CU00687B.
(archivo adjunto CU00687B.rar, descarga estando logeado en el foro)

Diagrama de clases en archivo adjunto "DiagramaDeClases.jpg"

11
Mi versión del Ejercicio propuesto en la Entrega Nº86. Ejercicio CU00686B.

El código corre y hace lo que se pretende. Sin embargo -además de las observaciones que me harán- tengo una duda respecto a lo siguiente:

Dentro de la clase TestHerencia2 está el método main, y otros dos métodos. La incorporación de estos dos métodos es lo que "me hace ruido" en cuanto a la filosofía de la POO, ya que la clase GestionTipoProducto modifica campos del método main a través de esos dos métodos.

Hubiera preferido no tener que incluirlos pero me es inevitable a la hora de: no repetir código, y no declarar los campos (tmpString y tmpInt) como públicos.


Clase Producto

Código: [Seleccionar]
/**
 * Clase Producto.
 *
 * @author (RaGa)
 * @version (20150407)
 */
public class Producto
{
    // Declaración de campos de instancia.
    private String fechaDeCaducidad;
    private int nroLote;

    /**
     * Constructor de la clase Producto.
     *
     * Se iniciliza con dos parámetros:
     * fechaDeCaducidad (tipo String) que es la fecha de caducidad del producto.
     * nroLote (tipo int) que es el número de lote al que corresponde el producto.
     */
    public Producto(String fechaDeCaducidad, int nroLote){
        this.fechaDeCaducidad = fechaDeCaducidad;
        this.nroLote = nroLote;
    } // fin del constructor
   
//SETTERS//
   
    /**
     * Método setFechaDeCaducidad
     * Establece la fecha de caducidad del producto.
     *
     * @param fechaDeCaducidad representa la fecha de caducidad del producto.
     */
    public void setFechaDeCaducidad(String fechaDeCaducidad){this.fechaDeCaducidad = fechaDeCaducidad;}
   
    /**
     * Método setNroLote
     * Establece el número de lote del producto.
     *
     * @param nroLote representa el número de lote del producto.
     */
    public void setNroLote(int nroLote){this.nroLote = nroLote;}
   
//GETTERS// 
   
    /**
     * Método getFechaDeCaducidad
     * El método devuelve la fecha de caducidad del producto.
     *
     * @return retorna la fecha de caducidad del producto.
     */
    public String getFechaDeCaducidad(){return fechaDeCaducidad;}
   
    /**
     * Método getNroLote
     * El método devuelve el número de lote del producto.
     *
     * @return retorna el número de lote del producto.
     */
    public int getNroLote(){return nroLote;}
   
// MÉTODOS VARIOS //   

    /**
     * Método mostrarFechaDeCaducidad
     *
     * El método muestra la fecha de caducidad del producto.
     */
    public void mostrarFechaDeCaducidad(){System.out.print(fechaDeCaducidad+"\n");}
   
     /**
     * Método mostrarNroLote
     *
     * El método muestra el numero de lote del producto.
     */
    public void mostrarNroLote(){System.out.print(nroLote+"\n");}
   
   
   
}  // find e la clase


Clase ProductoFresco

Código: [Seleccionar]
/**
 * Clase ProductoFresco
 *
 * @author (RaGa)
 * @version (20150407)
 */
public class ProductoFresco extends Producto
{
    // Declaración de campos de instancia.
    private String fechaEnvasado;
    private String paisDeOrigen;   

    /**
     * Constructor de la clase ProductoFresco
     *
     * Se debe pasar como parámetro los campos de la superclase Producto.
     * Los campos específicos de esta clase son:
     * fechaEnvasado que representa la fecha de envasado del producto fresco (tipo String) y se inicializa como "desconocida".
     * paisDeOrigen que representa el país de origen del producto fresco (tipo String) y se inicializa como "desconocido".
     */
    public ProductoFresco(String fechaDeCaducidad, int nroLote){
        super (fechaDeCaducidad,nroLote);
        fechaEnvasado = "desconocida";
        paisDeOrigen = "desconocido";
    } // fin del constructor

//SETTERS//

    /**
     * Método setFechaEnvasado
     * Establece la fecha de envasado del producto fresco.
     *
     * @param representa la fecha de envasado del producto fresco.
     */
    public void setFechaEnvasado(String fechaEnvasado){this.fechaEnvasado = fechaEnvasado;}
   
     /**
     * Método setPaisDeOrigen
     * Establece el pais de origen del producto fresco.
     *
     * @param representa el pais de origen del producto fresco.
     */
    public void setPaisDeOrigen(String paisDeOrigen){this.paisDeOrigen = paisDeOrigen;}
   
//GETTERS// 
   
    /**
     * Método getFechaEnvasado
     * El método devuelve la fecha de envase del producto fresco.
     *
     * @return retorna la fecha de envase del producto fresco.
     */
    public String getFechaEnvasado(){return fechaEnvasado;}
   
     /**
     * Método getPaisDeOrigen
     * El método devuelve el pais de origen del producto fresco.
     *
     * @return retorna el pais de origen del producto fresco.
     */
    public String getPaisDeOrigen(){return paisDeOrigen;}
   
   
// MÉTODOS VARIOS //   

    /**
     * Método mostrarFechaEnvasado
     *
     * El método muestra la fecha de envasado del producto fresco.
     */
    public void mostrarFechaEnvasado(){System.out.print(fechaEnvasado+"\n");}

    /**
     * Método mostrarPaisDeOrigen
     *
     * El método muestra el pais de origen del producto fresco.
     */
    public void mostrarPaisDeOrigen(){System.out.print(paisDeOrigen+"\n");}
   
} // fin de la clase


Clase ProductoRefrigerado

Código: [Seleccionar]
/**
 * Clase ProductoRefrigerado
 *
 * @author (RaGa)
 * @version (20150407)
 */
public class ProductoRefrigerado extends Producto
{
    // Declaración de campos de instancia.
    private String codigoOSA;

    /**
     * Constructor de la clase ProductoRefrigerado
     *
     * Se debe pasar como parámetro los campos de la superclase Producto.
     * El campos específico de esta clase es:
     * codigoOSA que representa el código del organismo de supervisión alimentaria del producto refrigerado (tipo String) y se inicializa como "desconocido".
     */
    public ProductoRefrigerado(String fechaDeCaducidad, int nroLote){
        super (fechaDeCaducidad,nroLote);
        codigoOSA = "desconocido";
    } // fin del constructor

//SETTERS//

    /**
     * Método setCodigoOSA
     * Establece el código del organismo de supervisión alimentaria.
     *
     * @param representa el código del organismo de supervisión alimentaria.
     */
    public void setCodigoOSA(String codigoOSA){this.codigoOSA = codigoOSA;}
   
//GETTERS// 
   
    /**
     * Método getCodigoOSA
     * El método devuelve el código del organismo de supervisión alimentaria.
     *
     * @return retorna el código del organismo de supervisión alimentaria.
     */
    public String getCodigoOSA(){return codigoOSA;}
   
   
// MÉTODOS VARIOS //   

    /**
     * Método mostrarCodigoOSA
     *
     * El método muestra el código del organismo de supervisión alimentaria.
     */
    public void mostrarCodigoOSA(){System.out.print(codigoOSA+"\n");}   
   
} // fin de la clase


Clase ProductoCongelado

Código: [Seleccionar]
/**
 * Clase ProductoCongelado
 *
 * @author (RaGa)
 * @version (20150408)
 */
public class ProductoCongelado extends Producto
{
    // Declaración de campos de instancia.
    private int tempCongelacionRecomendada;
   
    /**
     * Constructor de la clase ProductoCongelado
     *
     * Se debe pasar como parámetro los campos de la superclase Producto.
     * El campo específico de esta clase es:
     * tempCongelacionRecomendada que representa la temperatura de congelación recomendada (tipo int) y se inicializa como -500.
     */


    public ProductoCongelado(String fechaDeCaducidad, int nroLote){
        super (fechaDeCaducidad,nroLote);
        tempCongelacionRecomendada = -500;
    } // fin del constructor

//SETTERS//

    /**
     * Método setFechaEnvasado
     * Establece la temperatura de congelación recomendada.
     *
     * @param representa la temperatura de congelación recomendada.
     */
    public void setTempCongelacionRecomendada(int tempCongelacionRecomendada){this.tempCongelacionRecomendada = tempCongelacionRecomendada;}
   
//GETTERS// 
   
    /**
     * Método getTempCongelacionRecomendada
     * El método devuelve la temperatura de congelacion recomendada.
     *
     * @return retorna la temperatura de congelacion recomendada.
     */
    public int getTempCongelacionRecomendada(){return tempCongelacionRecomendada;}

   
// MÉTODOS VARIOS //   

    /**
     * Método mostrarTempCongelacionRecomendada
     *
     * El método muestra la temperatura de congelacion recomendada.
     */
    public void mostrarTempCongelacionRecomendada(){System.out.print(tempCongelacionRecomendada);}     

   
} // fin de la clase


Clase TestHerencia2

Código: [Seleccionar]

/**
 * Clase TestHerencia2.
 * Esta clase sirve para probar nuestro incipiente incursión en el tema Herencia de Java.
 *
 * @author (RaGa)
 * @version (20150408)
 */
public class TestHerencia2{
   
    // Declaración de campos de instancia
    static String tmpFechaDeCaducidad;
    static int tmpNroLote;


    /**
     * Constructor de la clase TestHerencia2 vacío.
     */
    public TestHerencia2(){
    }

    /**
     * Método main.
     */
    public static void main (String[] args){
        // Declaración de los campos de clase
        String tmpString;
        int tmpInt;

//CARGA DE PRODUCTOS       
        System.out.print("\fBienvenido a la carga de Productos Alimenticios!\n");
        //Carga de un Producto Fresco
        Exibidor.mostrarEncabezadoProductoTipo("Fresco");
        GestorTipoProducto.pedirCampos();
        ProductoFresco miProductoFresco = new ProductoFresco(tmpFechaDeCaducidad,tmpNroLote);
        System.out.println("Por favor ingrese la fecha de envasado:");
        miProductoFresco.setFechaEnvasado(GestionadorEntradasTeclado.leerString());
        System.out.println("Por favor ingrese el país de origen del producto:");
        miProductoFresco.setPaisDeOrigen(GestionadorEntradasTeclado.leerString());
 
        //Carga de un Producto Refrigerado
        Exibidor.mostrarEncabezadoProductoTipo("Refrigerado");
        GestorTipoProducto.pedirCampos();
        ProductoRefrigerado miProductoRefrigerado = new ProductoRefrigerado(tmpFechaDeCaducidad,tmpNroLote);
        System.out.println("Por favor ingrese el Código del organismo de supervisión alimentaria:");
        miProductoRefrigerado.setCodigoOSA(GestionadorEntradasTeclado.leerString());
       
        //Carga de un Producto Congelado
        Exibidor.mostrarEncabezadoProductoTipo("Congelado");
        GestorTipoProducto.pedirCampos();
        ProductoCongelado miProductoCongelado = new ProductoCongelado(tmpFechaDeCaducidad,tmpNroLote);
        System.out.println("Por favor ingrese la temperatura de congelación recomendada:");
        miProductoCongelado.setTempCongelacionRecomendada(GestionadorEntradasTeclado.leerInt());

// MUESTRA DE PRODUCTOS CARGADOS
        System.out.println("\fProductos Alimenticios cargados por el sistema");
       
        //Muestra del Producto Fresco cargado
        Exibidor.mostarRotuloProductoTipo("Fresco");
        System.out.print("Fecha de caducidad: "); miProductoFresco.mostrarFechaDeCaducidad();
        System.out.print("Nro.de Lote: "); miProductoFresco.mostrarNroLote();
        System.out.print("Fecha de Envasado: "); miProductoFresco.mostrarFechaEnvasado();
        System.out.print("País de Origen: "); miProductoFresco.mostrarPaisDeOrigen();
       
       
        //Muestra del Producto Refrigerado cargado
        Exibidor.mostarRotuloProductoTipo("Refrigerado");
        System.out.print("Fecha de caducidad: "); miProductoRefrigerado.mostrarFechaDeCaducidad();
        System.out.print("Nro.de Lote: "); miProductoRefrigerado.mostrarNroLote();
        System.out.print("Código del organismo de supervisión alimentaria: "); miProductoRefrigerado.mostrarCodigoOSA();

        //Muestra del Producto Congelado cargado
        Exibidor.mostarRotuloProductoTipo("Congelado");
        System.out.print("Fecha de caducidad: "); miProductoCongelado.mostrarFechaDeCaducidad();
        System.out.print("Nro.de Lote: "); miProductoCongelado.mostrarNroLote();
        System.out.print("Temperatura de congelación recomendada: "); miProductoCongelado.mostrarTempCongelacionRecomendada();
       
    } // fin método main
   
   

     /**
     * Método cargarFechaCaducidadTipoProducto.
     * Sirve para cargar el campo tmpFechaDeCaducidad el cual servirá como parámetro para inicilizar un producto.
     *
     * @param Recibe como parámetro un String con la fecha de caducidad del producto.
     */
   
    public static void cargarFechaCaducidadTipoProducto(String valorTmpFechaDeCaducidad){
        tmpFechaDeCaducidad = valorTmpFechaDeCaducidad;
    }
   
     /**
     * Método cargarNroLoteTipoProducto.
     * Sirve para cargar el campo tmpNroLote el cual servirá como parámetro para inicilizar un producto.
     *
     * @param Recibe como parámetro un int con el numero de lote del producto.
     */
   
    public static void cargarNroLoteTipoProducto(int valorTmpNroLote){
        tmpNroLote = valorTmpNroLote;
    }   
   

   
} // fin de la clase


Clase GestorTipoProducto

Código: [Seleccionar]
/**
 * Clase GestorTipoProducto.
 *
 * Esta clase sirve para gestionar los parámetros necesarios para inicilizar un objeto tipo Producto.
 *
 * @author (RaGa)
 * @version (20150408)
 */
public class GestorTipoProducto{
   
    /**
    * Método pedirCampos.
    *
    * Esta método sirve para pedir al Usuario ingrese por Teclado los
    * parámetro que necesita el Constructor de la clase Producto.
    *
    */
    public static void pedirCampos(){
        System.out.println("Por favor ingrese la fecha de caducidad:");
        TestHerencia2.cargarFechaCaducidadTipoProducto(GestionadorEntradasTeclado.leerString());
        System.out.println("Por favor ingrese el número de lote:");
        TestHerencia2.cargarNroLoteTipoProducto(GestionadorEntradasTeclado.leerInt());
    } //fin de método

   
} // fin de clase


Clase Exibidor

Código: [Seleccionar]
/**
 * Clase Exibidor.
 *
 * Esta clase sirve mostrar datos por consola.
 *
 * @author (RaGa)
 * @version (20150408)
 */
public class Exibidor{
   
    /**
    * Método mostrarEncabezadoProductoTipo.
    *
    * Esta método sirve para mostrar el encabezado al momento de la carga de los productos.
    *
    * @param El parámetro de entrada corresponde al tipo de producto que se cargara (Congelado, Refrigerado, o Fresco). Este parámetro tipo String es el que se mostrará por consola.
    *
    */
    public static void mostrarEncabezadoProductoTipo(String tipoDeProducto){
        System.out.print("------------------------------------------------\n");
        System.out.print("");
        System.out.println("A continuación se cargará un Producto "+tipoDeProducto+"...");
        System.out.println("");
    } //fin de método
   
    /**
    * Método mostarRotuloProductoTipo.
    *
    * Esta método muestra por consola un encabezado donde se indica el tipo de Producto.
    *
    * @param El parámetro corresponde al tipo de producto (Congelado, Refrigerado, o Fresco).
    *
    */
    public static void mostarRotuloProductoTipo(String tipoDeProducto){
        System.out.println("------------------------------------------------\n");
        System.out.println("[ Producto "+tipoDeProducto+" ]");
        System.out.println("");
    } // fin de método 
   
   
} // fin de clase


Clase GestionadorEntradasTeclado

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

/**Esta clase sirve para leer los valores ingresados por el usuario a través del teclado. Cuenta con dos métodos estáticos 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
 */

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 que corrsponde al valor ingresado por el usuario a través del teclado.
     * @return retorna un objeto tipo String.
     */
     public static String leerString(){
        Scanner scannerTeclado = new Scanner (System.in);
        String valorTeclado = scannerTeclado.nextLine();
        return valorTeclado;
    }
   
    /**Devuelve un valor tipo int que corresponde al valor ingresado por el usuario a través del teclado.
    * @return retorna un valor tipo int.
    */
    public 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



12
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.

13
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.


14
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?

15
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.

16
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!

17
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?.

18
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]

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".