Autor Tema: Ejercicios Java método que reciba y devuelva un array primitivo arreglo de objet  (Leído 6052 veces)

novatada1

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 7
    • Ver Perfil
Hola. Necesito ayuda con esto de Java. Solo tengo semana y media trabajando con este lenguaje y no sé, pareciera que todo el mundo sin referencias en el asunto pueda hacerlo con tan solo "investigar" en internet pero en serio no me cabe en la cabeza  :-[

Tengo 2 enunciados que creo que se resuelven similarmente el primero dice:

"Encontrar entregas - Toma  un array de objetos nombres de estudiantes y entregas, y retorna un subset de siEntregaron de los estudiantes que si entregaron la asignacion"


para lo cual hice esto pero no me corre:

Código: [Seleccionar]
public static Object findSubmit(){
class Estudiante{
public final String nombre;
public final String apellido;
public final Boolean submit;

Estudiante(String nombre, String apellido, Boolean submit){
this.nombre = nombre;
this.apellido = apellido;
this.submit = submit;
}

public void mostrar(){
system.out.println("Nombre Estudiante: " + nombre + " Apellido: " + apellido + " Entrego asignacion: " + submit);
}
}

Estudiante[] arrayEst = new Estudiante[]{

new Student "Nombre1", "Apellido1", true),
new Student "Nombre2", "Apellido2", true),
new Student "Nombre3", "Apellido3", false),
new Student "Nombre4", "Apellido4", true),
new Student "Nombre5", "Apellido5", false),
new Student "Nombre6", "Apellido6", true),

};

for (int i=0; i< arrayEst.length; i++){
Estudiante[] siEntregaron = new Estudiante[]{};

if (arrayEst[ i ].submit == true) {
siEntregaron = arrayEst[ i ];
}
}
return siEntregaron;
}


El segundo enunciado dice:

"Filtrar Registros- dado un array de objetos de salud y un objeto filtro, retorna todos los record que coinciden con al menos un filtro"

Todo lo que consigo por internet son arrays de numeros y sumas, de verdad no tengo ni idea de cómo hacer esto. Para las tareas solo sigo intentando cosas hasta que algo corre pero sigo sin entender como se usa esto, alguien puede ayudarme?

« Última modificación: 26 de Agosto 2022, 19:15 por Alex Rodríguez »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re: Ejercicios de Java
« Respuesta #1 en: 28 de Julio 2022, 21:19 »
Java tiene la ventaja de que efectivamente hay mucha documentación y ejemplos por la red.
Pero, aunque no es un lenguaje difícil, tampoco es el más fácil de aprender. Y como todo, al iniciarse hacen falta explicaciones.

En tu código hay numerosos errores y de todos modos no está estructurado de forma que sea un programa Java.
Mira, para no liar más la madeja, lo mejor es separar el código en distintas clases, siempre que sea posible.

Así que comienza un proyecto Java nuevo, crea una package con el nombre que te de la gana, y dentro de este package escribiremos la clase, o clases, que vamos a necesitar.

Parece ser que necesitas una clase Estudiante. Pues escribamos primero esta clase.
Dicha clase no va a ser ejecutable, por sí sola no sirve para poner en marcha ningún proceso.
Simplemente va a modelar las características que deseamos tenga un estudiante.
Y para este ejercicio vamos a querer que un estudiante tenga como atributos nombre, apellido y un boolean para indicar si ha entregado(true) o no(false) un trabajo asignado.

Además de atributos, esta clase va a tener unos métodos. Es decir, una serie de funciones que permiten realizar distintas tareas con un Estudiante.
Unos nos van a proporcionar los valores actuales de los atributos, otros permitirán modificarlos y además tendremos uno para mostrar en pantalla todos los valores de los atributos en una sola línea.

Código: [Seleccionar]
package entregasEstudiantes;

public class Estudiante {

//Atributos
private String nombre;
private String apellido;
private boolean entregado;

//Constructor
public Estudiante(String nombre, String apellido, boolean entregado) {
this.nombre = nombre;
this.apellido = apellido;
this.entregado = entregado;
}

//Metodos get y set
public String getNombre() {
return nombre;
}

public void setNombre(String nombre) {
this.nombre = nombre;
}

public String getApellido() {
return apellido;
}

public void setApellido(String apellido) {
this.apellido = apellido;
}

public boolean isEntregado() {
return entregado;
}

public void setEntregado(boolean entregado) {
this.entregado = entregado;
}

//Método para mostrar datos del Estudiante
public void mostrar(){
System.out.println("Nombre: " + nombre + " Apellido: " + apellido +
" Entrego asignacion: " + entregado);
}
}

Ya tenemos clase Estudiante. Como he dicho, esta clase por si sola no sirve para ejecutar ningún programa.
Necesitamos otra clase, que será la clase principal, la cuál tendrá el método main()
Este es un método especial, que es el que se encarga de hacer que un programa se pueda ejecutar.
Si en nuestro proyecto no tenemos al menos una clase que cuente con dicho método, jamás podremos ejecutar nada.

Este método siempre se declara de esta forma:
Código: [Seleccionar]
package entregasEstudiantes;

public class ListarEntregados {

public static void main(String[] args) {

//Aquí vamos a escribir el código para el programa principal

}

}

Bien, pues dentro de sus llaves es donde vamos a escribir el código que ponga en marcha el programa.
Vamos a ir viéndolo paso a paso.

Primero, vamos a necesitar un array con unos cuantos Estudiantes:
Código: [Seleccionar]
package entregasEstudiantes;

public class ListarEntregados {

public static void main(String[] args) {

//Creamos unos estudiantes genéricos
Estudiante[] arrayEst = new Estudiante[]{

new Estudiante( "Nombre1", "Apellido1", true),
new Estudiante( "Nombre2", "Apellido2", true),
new Estudiante( "Nombre3", "Apellido3", false),
new Estudiante( "Nombre4", "Apellido4", true),
new Estudiante( "Nombre5", "Apellido5", false),
new Estudiante( "Nombre6", "Apellido6", true),
};

}

}

Ahora, habría que buscar la manera de crear un segundo array que contenga solo los estudiantes que sí han entregado sus asignaciones.
El código para hacer esto, podríamos escribirlo dentro del método main() tras la creación de los estudiantes genéricos.

Sin embargo, resulta más elegante y queda más ordenado, si creamos un método por separado que se encargue de esta tarea.
Este método se escribe dentro de esta clase, pero FUERA del método main().

Lo podemos declarar de esta manera:
Citar
public class ListarEntregados {

   //Método main principal que pone en marcha el programa
   public static void main(String[] args) {
      
      //Creamos unos estudiantes genéricos
      Estudiante[] arrayEst = new Estudiante[]{

            new Estudiante( "Nombre1", "Apellido1", true),
            new Estudiante( "Nombre2", "Apellido2", true),
            new Estudiante( "Nombre3", "Apellido3", false),
            new Estudiante( "Nombre4", "Apellido4", true),
            new Estudiante( "Nombre5", "Apellido5", false),
            new Estudiante( "Nombre6", "Apellido6", true),
      };

   }
   
   /* Este método se encarga de recibir un array de estudiantes
    * y crear un nuevo array con solo los estudiantes que han
    * entregado sus asignaciones.
    */

   private static Estudiante[] obtenerEntregados(Estudiante[] estudiantes) {
      //Código para obtener los entregados
   }


}

Fíjate en las partes que marco en rojo. Ahí estamos diciendo que ese método va a RETORNAR un array de Estudiante, y que además va a RECIBIR también como argumento (lo que está entre paréntesis) otro array de Estudiante, y que lo vamos a llamar estudiantes.
Así del array que recibe va a extraer los estudiantes que han hecho entrega, construirá un nuevo array con ellos y lo retornará.
Este array retornado, será recogido en el programa principal para mostrarlo en pantalla, eso lo veremos luego.

Vamos a centrarnos en como crear un array con los estudiantes correctos.
Primero, necesitamos saber cuántos estudiantes han hecho la entrega, porque no podemos crear un array si no sabemos de antemano cuántos elementos va a contener.

Así que lo que haremos será recorrer el array de estudiantes dos veces:
- una para contar los entregados y poder crear un array con el tamaño adecuado
- la segunda, para copiar los estudiantes correctos al nuevo array.

Citar
public class ListarEntregados {

   public static void main(String[] args) {
      
      //Creamos unos estudiantes genéricos
      Estudiante[] arrayEst = new Estudiante[]{

            new Estudiante( "Nombre1", "Apellido1", true),
            new Estudiante( "Nombre2", "Apellido2", true),
            new Estudiante( "Nombre3", "Apellido3", false),
            new Estudiante( "Nombre4", "Apellido4", true),
            new Estudiante( "Nombre5", "Apellido5", false),
            new Estudiante( "Nombre6", "Apellido6", true),
      };

   }
   
   /* Este método se encarga de recibir un array de estudiantes
    * y crear un nuevo array con solo los estudiantes que han
    * entregado sus asignaciones.
    */

   private static Estudiante[] obtenerEntregados(Estudiante[] estudiantes) {
      
      //Primero contamos cuantos estudiantes han hecho entrega
      int contEntregados = 0;
      for (int in = 0; in < estudiantes.length; in++) {
         if (estudiantes[in].isEntregado()) //Si este estudiante ha entregado...
            contEntregados++; //...lo contamos
      }
      
      //Ahora ya sabemos cuánto va a medir el nuevo array, podemos crearlo
      Estudiante[] entregados = new Estudiante[contEntregados];
      
      /*
       * Lo siguiente es volver a recorrer el array de estudiantes
       * y copiar los entregados al nuevo array.
       * Como se va a trabajar con dos arrays que son de tamaños distintos,
       * vamos a necesitar un indice diferente para cada uno, ya que cada uno
       * ha de apuntar a posiciones distintas en los arrays
       */

      int indice1 = 0; //Indice para el array de estudiantes
      int indice2 = 0; //Indice para el array de entregados
      for (indice1 = 0; indice1 < estudiantes.length; indice1++) {
         if (estudiantes[indice1].isEntregado())  {
//Si este estudiante ha entregado...
            entregados[indice2] = estudiantes[indice1]; //Hacemos copia en array entregados
            indice2++; //Incrementamos el indice de los entregados
         }
      }

      
      //Por último, retornamos array de entregados
      return entregados;
   }


}


OK, ya tenemos un método que es capaz de crear un array con los estudiantes entregados, a partir de una lista de estudiantes.

Pues ahora volvemos al main() y lo que haremos será invocar a este método y recoger el array que nos va a retornar:
Citar
public class ListarEntregados {

   public static void main(String[] args) {
      
      //Creamos unos estudiantes genéricos
      Estudiante[] arrayEst = new Estudiante[]{

            new Estudiante( "Nombre1", "Apellido1", true),
            new Estudiante( "Nombre2", "Apellido2", true),
            new Estudiante( "Nombre3", "Apellido3", false),
            new Estudiante( "Nombre4", "Apellido4", true),
            new Estudiante( "Nombre5", "Apellido5", false),
            new Estudiante( "Nombre6", "Apellido6", true),
      };
      
      //El siguiente método nos retorna un array con solo los entregados
      Estudiante[] listaEntregados = obtenerEntregados(arrayEst);


   }
   
   /* Este método se encarga de recibir un array de estudiantes
    * y crear un nuevo array con solo los estudiantes que han
    * entregado sus asignaciones.
    */
   private static Estudiante[] obtenerEntregados(Estudiante[] estudiantes) {
      
      //Primero contamos cuantos estudiantes han hecho entrega
      int contEntregados = 0;
      for (int in = 0; in < estudiantes.length; in++) {
         if (estudiantes[in].isEntregado()) //Si este estudiante ha entregado...
            contEntregados++; //...lo contamos
      }
      
      //Ahora ya sabemos cuánto va a medir el nuevo array, podemos crearlo
      Estudiante[] entregados = new Estudiante[contEntregados];
      
      /*
       * Lo siguiente es volver a recorrer el array de estudiantes
       * y copiar los entregados al nuevo array.
       * Como se va a trabajar con dos arrays que son de tamaños distintos,
       * vamos a necesitar un indice diferente para cada uno, ya que cada uno
       * ha de apuntar a posiciones distintas en los arrays
       */
      int indice1 = 0; //Indice para el array de estudiantes
      int indice2 = 0; //Indice para el array de entregados
      for (indice1 = 0; indice1 < estudiantes.length; indice1++) {
         if (estudiantes[indice1].isEntregado())  {//Si este estudiante ha entregado...
            entregados[indice2] = estudiantes[indice1]; //Hacemos copia en array entregados
            indice2++; //Incrementamos el indice de los entregados
         }
      }
      
      //Por último, retornamos array de entregados
      return entregados;
   }

}

Pues ahora que ya tenemos la lista de los entregados, ya solo hay que recorrerla y mostrarla en pantalla:
Citar
public class ListarEntregados {

   public static void main(String[] args) {
      
      //Creamos unos estudiantes genéricos
      Estudiante[] arrayEst = new Estudiante[]{

            new Estudiante( "Nombre1", "Apellido1", true),
            new Estudiante( "Nombre2", "Apellido2", true),
            new Estudiante( "Nombre3", "Apellido3", false),
            new Estudiante( "Nombre4", "Apellido4", true),
            new Estudiante( "Nombre5", "Apellido5", false),
            new Estudiante( "Nombre6", "Apellido6", true),
      };
      
      //El siguiente método nos retorna un array con solo los entregados
      Estudiante[] listaEntregados = obtenerEntregados(arrayEst);
      
      //Para terminar, mostramos en pantalla los datos de los que han entregado
      System.out.println("\t\tLista de Estudiantes con asignación entregada\n");
      for (int in = 0; in < listaEntregados.length; in++)
         listaEntregados[in].mostrar();
      
      System.out.println("\n\t\tFIN DE PROGRAMA");


   }
   
   /* Este método se encarga de recibir un array de estudiantes
    * y crear un nuevo array con solo los estudiantes que han
    * entregado sus asignaciones.
    */
   private static Estudiante[] obtenerEntregados(Estudiante[] estudiantes) {
      
      //Primero contamos cuantos estudiantes han hecho entrega
      int contEntregados = 0;
      for (int in = 0; in < estudiantes.length; in++) {
         if (estudiantes[in].isEntregado()) //Si este estudiante ha entregado...
            contEntregados++; //...lo contamos
      }
      
      //Ahora ya sabemos cuánto va a medir el nuevo array, podemos crearlo
      Estudiante[] entregados = new Estudiante[contEntregados];
      
      /*
       * Lo siguiente es volver a recorrer el array de estudiantes
       * y copiar los entregados al nuevo array.
       * Como se va a trabajar con dos arrays que son de tamaños distintos,
       * vamos a necesitar un indice diferente para cada uno, ya que cada uno
       * ha de apuntar a posiciones distintas en los arrays
       */
      int indice1 = 0; //Indice para el array de estudiantes
      int indice2 = 0; //Indice para el array de entregados
      for (indice1 = 0; indice1 < estudiantes.length; indice1++) {
         if (estudiantes[indice1].isEntregado())  {//Si este estudiante ha entregado...
            entregados[indice2] = estudiantes[indice1]; //Hacemos copia en array entregados
            indice2++; //Incrementamos el indice de los entregados
         }
      }
      
      //Por último, retornamos array de entregados
      return entregados;
   }

}

Y ya está.
Hemos creado el programa en dos clases separadas: un modelo de clase Estudiante y la clase principal ejecutable.
Y esta clase principal, la hemos dividido en dos métodos: uno el main() (obligatorio en todo proyecto Java que queramos ejecutar) con el flujo del programa principal y otro método que se encarga expresamente de TOMAR un array de estudiantes y RETORNAR otro array con solo los estudiantes que han hecho la entrega.

En realidad este ejercicio se podría resolver con menos código, sin crear un método separado como hemos hecho.
Pero esto es lo que está pidiendo el enunciado, fíjate en las palabras que señalo:
Citar
"Encontrar entregas - Toma  un array de objetos nombres de estudiantes y entregas, y retorna un subset de siEntregaron de los estudiantes que si entregaron la asignacion"

Tomar y retornar... Aunque no lo diga claramente, cuando se usan esas palabras es que quieren que hagamos un método que reciba un dato, trabaje con él y retorne un resultado.

Bueno. Prueba el programa que he escrito. Revisa el código y asegurate de que entiendes cómo hemos estructurado el programa, la sintaxis del código y sobre todo la lógica que se ha seguido.

E intenta ahora escribir tú, o al menos comenzar, el segundo ejercicio.
Para ser sinceros, me parece un ejercicio algo difícil para alguien que está empezando. Además el enunciado es muy pobre, debería dar instrucciones más precisas.

Yo mismo no estoy muy seguro de cómo enfocarlo, la verdad... :(
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

novatada1

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 7
    • Ver Perfil
Re: Ejercicios de Java
« Respuesta #2 en: 28 de Julio 2022, 23:46 »
 :o Kabuto por dios podria llorar de felicidad, que diferencia hace verle sentido a algo, no puedo creer que de hecho te entendi mucho de lo que dijiste, pense que se podia hacer todo en un solo bloque de verdad no he visto nada similar a esto  :'(

voy a intentar aplicarlo para el segundo enunciado, pues si creo que tienen que ser similares, y te comento como me va, no prometo nada pero de verdad me sirve de mucha guia lo que pusiste, en serio te agradezco mucho!

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re: Ejercicios de Java
« Respuesta #3 en: 29 de Julio 2022, 00:22 »
Sí, el siguiente ejercicio es muy similar. Lo único que puede ser algo más difícil es idear como representar eso de "los filtros", ya que el enunciado no da indicaciones precisas y lo deja todo en manos de nuestra imaginación.

Mejor si intentas tú dar con alguna solución. Aunque no lo consigas, no importa, el simple hecho de intentarlo, atascarte, ver cuáles son las dificultades,... eso ya sirve para aprender mucho.

Aún así, voy a dejar aquí la solución que he concluido yo.
Mi idea ha sido modelar una clase que represente "objetos de salud", con los atributos nombre, descripción y filtros
Este último atributo, los filtros, sería una serie de palabras "clave" que servirían para identificar un objeto según unas categorías.

Por ejemplo, unas mascarillas podrían tener como filtros las palabras "desechable"(son de usar y tirar), "prevencion"(no sirven para curar, sirven para prevenir infecciones), "bucal", "nasal" (protegen nariz y boca)

Un Termometro Digital podría tener como filtros "temperatura"(sirve para medir eso), "digital" (para diferenciarlo de uno de mercurio, aunque están prohibidos en la mayor parte del mundo) y "diagnostico"(no sirve para curar ni prevenir, si no para diagnosticar el estado de salud)

Entonces, el programa consistiría en pedir al usuario que nos indique un filtro, o varios filtros, y entonces buscar cuáles son los objetos que coinciden con esos filtros y mostrarlos en pantalla.

Como para los filtros vamos a usar varias palabras, en lugar de usar muchos Strings, podemos tratarlos como una única cadena, separando cada palabra con un punto y coma para distinguir un filtro de otro.
Por ejemplo: "temperatura;digital;diagnostico"
Ahí tenemos tres filtros en una única cadena. Y podríamos tener cinco, diez..., tantos como queramos.

Bueno, pues como antes, haremos una clase para modelar el "Objeto de Salud" y otra con el programa principal main().

Esta sería la clase ObjetoSalud. En esta ocasión no he puesto todos los métodos get y set, ya que total para este ejercicio no los vamos a utilizar.
Solo le he puesto los dos métodos que necesitamos.
Uno es el "clásico" método toString(), que construye una cadena con los datos que queremos mostrar en pantalla para representar un objeto de esta clase.

El otro, es un método boolean que recibe una cadena de filtros como argumento.
Separa estos filtros en cadenas separadas (con el método split() de la clase String).
Una vez separados, comprueba si alguno de esos filtros coincide con los indicados en el atributo "filtros" de este objeto.

Si coincide alguno, retorna true. Si no coincide ninguno, retorna false.
Así gracias a este método sabremos que objetos hay que seleccionar según los filtros indicados por el usuario.
Código: [Seleccionar]
package objetosSaludFiltro;

public class ObjetoSalud {

private String nombre;
private String descripcion;
private String filtros;

public ObjetoSalud(String nombre, String descripcion, String filtros) {
this.nombre = nombre;
this.descripcion = descripcion;
this.filtros = filtros;
}

/*
* Recibe una cadena con varios filtros y comprueba
* si al menos uno coinciden con los de este objeto
*/
public boolean coincideFiltro(String filtros) {
/*
* Recibimos una cadena con varios filtros
* separados por un punto y coma.
* Vamos a separar cada filtro como una cadena
* única y los agruparemos en un array
*/
String[] flt = filtros.split(";");

/*
* Ahora recorremos este array y si algún filtro coincide
* con los de este objeto, retornamos true
*/
for (String filtro: flt)
if (this.filtros.contains(filtro))
return true;

//Si este bucle termina sin retornar true, es que ningún filtro coincide
return false;
}

/*
* Construye una cadena descriptiva de este objeto
* y la retorna para que pueda ser mostrada en pantalla
*/
public String toString() {
return "Nombre: " + nombre + " ----- Descripcion: " + descripcion;
}

Y ahora la clase principal.
Como antes, crearemos un array con varios objetos predefinidos. Esta vez si les he dado valores "reales" para hacer más interesante el ejercicio.
Además hay una lista de los posibles filtros que el usuario puede elegir.

Y esta vez, usaremos un bucle para que el programa se repita una y otra vez, hasta que el usuario elija cuando terminar.
En cada repetición del bucle, le mostraremos la lista de filtros disponible y le pediremos que introduzca uno o varios filtros, separados con punto y coma.

Cuando nos de una lista de filtros, usaremos un método que creará un segundo array solo con los objetos que coincidan con esos filtros, se mostrarán en pantalla y el proceso volverá a repetirse.
Si el usuario quiere terminar el programa, tiene que pulsar ENTER sin teclear nada cuando le pidamos filtros.


Como ves la lógica es muy similar al ejercicio anterior, pero esta vez lo hacemos más interesante porque le vamos a pedir datos por teclado al usuario y el programa no termina hasta que no lo elija el usuario.

Código: [Seleccionar]
package objetosSaludFiltro;

import java.util.Scanner;

public class Filtrado {

public static void main(String[] args) {
//Objeto Scanner para solicitar entradas por teclado
Scanner teclado = new Scanner(System.in);

//Lista de filtros disponibles
final String FILTROS = "temperatura;digital;diagnostico;prevencion;bucal;nasal;topico"
+ "desechable;tratamiento;respiratorio;infrarrojo;oxigeno;";

//Objetos para la salud
ObjetoSalud[] objetos = new ObjetoSalud[] {
new ObjetoSalud("Termometro Digital", "Termometro para medir temperatura corporal por contacto",
"temperatura;digital;diagnostico"),
new ObjetoSalud("Termometro Infrarrojo", "Termometro para medir temperatura corporal sin contacto",
"temperatura;digital;diagnostico;infrarrojo"),
new ObjetoSalud("Oximetro Digital", "Dispositivo para medir saturación oxigeno en sangre",
"oxigeno;digital;diagnostico"),
new ObjetoSalud("Mascarilla FFP2", "Mascarilla para filtrado de particulas y aerosoles",
"bucal;nasal;prevencion;desechable"),
new ObjetoSalud("Jeringa sin aguja", "Jeringa con émbolo de apertura ancha para tomar muestras",
"desechable;diagnostico"),
new ObjetoSalud("Jeringa con aguja", "Jeringa con émbolo de apertura estrecha para inyecciones",
"desechable;tratamiento"),
new ObjetoSalud("Nebulizador eléctrico", "Dispositivo para vaporizar medicamentos y poder inhalarlos",
"digital;tratamiento;respiratorio;bucal"),
new ObjetoSalud("Gel hidroalcoholico", "Gel para desinfeccion de manos",
"prevencion;topico"),
new ObjetoSalud("Povidona Yodada", "Yodo antiséptico para desinfección de heridas",
"tratamiento;topico"),
};

/*
* A continuación haremos un bucle donde pediremos al usuario una serie de filtros.
* En cada iteración del bucle, mostraremos los Objetos de Salud que coincidan con esos filtros.
* El bucle termina cuando el usuario pulsa ENTER sin introducir ningún filtro
*/
String filtros = ""; //Aquí guardamos los filtros que el usuario introduzca
do {
System.out.println("\nFiltros disponibles:\n" + FILTROS);
System.out.println("\nIndique los filtros deseados, separados por ;");
System.out.println("O pulse ENTER sin teclear nada para FINALIZAR");
System.out.print("\nFiltros: ");
filtros = teclado.nextLine(); //Leemos filtros por teclado

if (!filtros.isBlank()) { //Solo buscamos objetos si el usuario nos ha dado algún filtro
ObjetoSalud[] filtrados = filtrarObjetos(objetos, filtros);
if (filtrados.length == 0)
System.out.println("\nNo hay Objetos de Salud que coincidan con esos filtros");
else {
System.out.println("\n\t********************************");
System.out.println("\n\t\tOBJETOS DE SALUD\n");
for (ObjetoSalud objeto: filtrados)
System.out.println(objeto);
System.out.println("\n\t********************************");
}
}

}while(!filtros.isBlank()); //Bucle termina si el usuario no introduce ningún filtro.

teclado.close();
System.out.println("\n\t\tFIN DE PROGRAMA");
}

/*
* Este método recibe un array con ObjetosSalud y una cadena con filtros.
* Se hace una selección de los objetos que coincidan con esos filtros
* y se retornan en un nuevo array.
*/
private static ObjetoSalud[] filtrarObjetos(ObjetoSalud[] objetos, String filtros) {

int contObjetos = 0;
for (int in = 0; in < objetos.length; in++)
if (objetos[in].coincideFiltro(filtros))
contObjetos++;

ObjetoSalud[] filtrados = new ObjetoSalud[contObjetos];
int indiceFiltrados = 0;

for (int indiceObjetos = 0; indiceObjetos < objetos.length; indiceObjetos++) {
if (objetos[indiceObjetos].coincideFiltro(filtros)) {
filtrados[indiceFiltrados] = objetos[indiceObjetos];
indiceFiltrados++;
}
}

return filtrados;
}

}


Y bueno, con los comentarios que he puesto en el código y en el ejercicio anterior, está todo más o menos explicado.
Pero no dudes en preguntar si algo no se entiende.

Y no te desesperes si no has podido encontrar tú soluciones. En mi humilde opinión, son ejercicios un tanto avanzados para pretender que sean resueltos por alguien recién iniciada y sin más explicaciones ni indicaciones que "búscate la vida por Internet"  :-\
« Última modificación: 29 de Julio 2022, 00:26 por Kabuto »
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

novatada1

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 7
    • Ver Perfil
Re: Ejercicios de Java
« Respuesta #4 en: 29 de Julio 2022, 03:48 »
ok a ver que te parece esto fue lo que hice aun no he leido tu propuesta. Y si, concuerdo 100% contigo este sistema educacional es terrible! es lo que odio de esta gente no dan clases como tal porque "los programadores deben saber investigar y usar recursos de internet" asi que nuestras "clases" fueron literalmente como sumar 2 arrays, como escribir 2 strings, pero los ejercicios son calcular fibonacci, sacar factoriales, hacer esto o crear expresiones lambda...  :-[
 Es por trabajo asi que no tengo opcion pero de verdad me estoy esforzando...
ok dime que opinas de esto y luego reviso tu propuesta, no se como pones el codigo en formato asi que puede que se lea feo pero esto fue lo que hice:

import java.util.ArrayList;

public class Filtro {
    private static Salud[] arrayFiltro;

    public static void main(String[] args) {
        Salud[] arrayRecords = new Salud[]{
                new Salud("Sangre", "Colesterol"),
                new Salud("Termometro", "Temperatura"),
                new Salud("Oximetro", "Oxigeno"),
                new Salud("Tensiometro", "Presion Arterial"),
                new Salud("Glucosa", "Azucar en la Sangre"),

        };

        Salud[] arrayFiltro = new Salud[]{
                new Salud("Gasa", "Suturas"),
                new Salud("Tensiometro", "Alcohol")
        };

        ArrayList<Salud> objetosFiltrados = filtrados(arrayRecords);

        for (Salud siExiste : objetosFiltrados) {
            siExiste.display();
        }
    }



    public static ArrayList<Salud> filtrados(Salud[] arrayRecords) {
        ArrayList<Salud> objetosFiltrados = new ArrayList<>();

        for(int i=0; i<arrayRecords.length; i++) {
            if(arrayRecords == arrayFiltro || arrayRecords.item == arrayFiltro.item || arrayRecords.item == arrayFiltro.item2 || arrayRecords.item2 == arrayFiltro.item) objetosFiltrados.add(arrayFiltro);
        }

        return objetosFiltrados;
    }
}


class Salud {
    public final String item;
    public final String item2;
    private Salud[] arrayRecords;

    public Salud(String item, String item2){
        this.item = item;
        this.item2 = item2;
    }

    public void display(){
        System.out.println("Los record que coinciden son: " + Filtro.filtrados(arrayRecords));
    }

    public String getItem() {
        return this.item;
    }
    public String getItem2() {
        return this.item2;
    }

}

El problema que me da es que o sale nulo el array de filtrados, o aceptando la opcion automatica del intellij compilador pone un codigo muy raro con los paquetes y las clases pero no el array... Leere tu clase ahora. Muchas gracias por tu tiempo, de verdad has renovado mi esperanza de poder superar esto


Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re: Ejercicios de Java
« Respuesta #5 en: 29 de Julio 2022, 13:31 »
Hola.

Mira, para publicar código aquí en el foro, has de ponerlo entre las etiquetas code
Estas etiquetas aparecen automáticamente en el texto de los botones de arriba del campo de texto, si pulsas el botón con esta imagen -->

Yo a veces, cuando quiero resaltar texto en colores para poder explicarme mejor, uso como alternativa las etiquetas quote, que es el botón con la imagen -->
No es lo ideal para compartir código, pero sí para dar explicaciones.

Sobre tu código, hay algunos fallos totalmente comprensibles si no se conoce bien el lenguaje Java.

El array te sale con valor nulo porque NUNCA se inicia con unos valores. Tu crees que sí, pero no es así.
El array que señalo en azul, en realidad, es otro array distinto del que señalo en rojo:
Citar
public class Filtro {
   
   private static Salud[] arrayFiltro;

   public static void main(String[] args) {
      Salud[] arrayRecords = new Salud[]{
            new Salud("Sangre", "Colesterol"),
            new Salud("Termometro", "Temperatura"),
            new Salud("Oximetro", "Oxigeno"),
            new Salud("Tensiometro", "Presion Arterial"),
            new Salud("Glucosa", "Azucar en la Sangre"),

      };

      Salud[] arrayFiltro = new Salud[]{
            new Salud("Gasa", "Suturas"),
            new Salud("Tensiometro", "Alcohol")
      };
Aunque se llamen igual, son arrays diferentes.
¿Por qué? Porque en el array que señalo en rojo, delante del nombre has puesto Salud[]
Citar
Salud[] arrayFiltro = new Salud[]

Al hacerlo así, Java interpreta que estás declarando un array totalmente nuevo, a pesar de que tiene el mismo nombre que el que hay señalado en azul. Y en esta ocasión te permite usar el mismo nombre para dos arrays, porque están en distintos ámbitos(lo de los ámbitos no lo vamos a explicar ahora porque será demasiada info de golpe...)

La cuestión es que para que Java sepa que en realidad lo que quieres inicializar es el array declarado previamente, para inicializarlo has de poner solamente su nombre, sin indicar su tipo de dato.
Citar
public class Filtro {
   
   private static Salud[] arrayFiltro;

   public static void main(String[] args) {
      Salud[] arrayRecords = new Salud[]{
            new Salud("Sangre", "Colesterol"),
            new Salud("Termometro", "Temperatura"),
            new Salud("Oximetro", "Oxigeno"),
            new Salud("Tensiometro", "Presion Arterial"),
            new Salud("Glucosa", "Azucar en la Sangre"),

      };

      arrayFiltro = new Salud[]{
            new Salud("Gasa", "Suturas"),
            new Salud("Tensiometro", "Alcohol")
      };
Aquí ahora, sí estamos tratando con el mismo array, y no con dos.


Sobre el método filtrados(), aquí hay mucho que comentar... ;)

Comencemos por la comparación que señalo en rojo.
Citar
   public static ArrayList<Salud> filtrados(Salud[] arrayRecords) {
      ArrayList<Salud> objetosFiltrados = new ArrayList<>();

      for(int i=0; i<arrayRecords.length; i++) {
         if(arrayRecords[ i] == arrayFiltro[ i] || arrayRecords[ i].item == arrayFiltro[ i].item || arrayRecords[ i].item == arrayFiltro[ i].item2 || arrayRecords[ i].item2 == arrayFiltro[ i].item)
            objetosFiltrados.add(arrayFiltro[ i]);
      }

      return objetosFiltrados;
   }

Ahí estás preguntando (bueno, pretendes preguntar...) si dos elementos de clase Salud son iguales

El comparador == solo sirve para comparar tipos de datos primitivos.
Los tipos int, double, char, float, boolean, byte, short y long son los llamados tipos primitivos.
Se les llama primitivos porque son datos simples, básicamente son valores numéricos y por eso es muy fácil compararlos para saber si son iguales == , si uno es mayor > , si es menor < ...
Para el ordenador es muy fácil determinar si 5 es mayor que 4.

En cambio, el resto de datos que vamos a manejar en Java, serán objetos de clase
String, ArrayList, Scanner, Math, Salud, Object, Persona, Animal, Estudiante, Vehículo,...
La lista es infinita porque nosotros mismos podemos crear tantas nuevas clases como nos de la imaginación.

Todos estos datos son mucho más complejos internamente y no es fácil hacer comparaciones entre ellos.
Ya no es solo una cuestión de complejidad interna, si no también de la naturaleza de cada clase.
Si comparamos dos objetos Persona para saber si son iguales, no podemos usar simplemente == y ya está.
Porque, ¿cómo puede saber el computador si son iguales?
¿Por tener mismo nombre y apellidos? Pues no, hay cientos de personas que se llaman Francisco Rodriguez Lopez y no son la misma...

Para comparar objetos de clases, hay que escribir código y decirle al computador cómo queremos que decida si son iguales, o quien es mayor y menor.
Para el ejemplo de objetos Persona, probablemente le pediremos que compare sus DNI / cédula identificativa para determinar si dos personas "son iguales".

Aunque quizás en nuestro programa nos da igual sus nombres e ID, quizás sea un programa para crear dietas saludables y entonces vamos a querer considerar a dos Personas iguales si tienen la misma edad y peso...

Pero bueno, no vamos a profundizar más en esto.
Lo importante es que recuerdes que hay dos tipos de datos:
- los primitivos (se escriben en minúscula) con los que podemos usar los operadores de comparación
- las clases (se escriben con la primera letra mayúscula) que por su complejidad y naturaleza variable se necesita escribir código extra para decidir cómo se comparan

Si para objetos de clase utilizas el comparador ==, Java te lo admite como sintaxis correcta, pero no va a hacer lo que tú necesitas.
Lo que va a hacer es comprobar si esos objetos, en realidad son uno solo pero con distintas referencias.
Tampoco quiero divagar mucho con esto ahora, pero has de saber que un mismo objeto de clase puede tener muchas referencias (nombres).
Si yo hago esto:
Código: [Seleccionar]
Persona persona1 = new Persona("Perico", "Palotes");
Persona persona2 = persona1;
Persona persona3 = persona2;
Hay tenemos tres referencias: persona1, persona2 y persona3.
Pero en realidad solo hay un objeto, lo que pasa es que esas tres referencias están apuntando al mismo objeto.
Entonces, si preguntamos esto:
Código: [Seleccionar]
if (persona1 == persona3)La respuesta será TRUE, porque apuntan al mismo objeto.

Ahora, si escribimos esto:
Código: [Seleccionar]
Persona persona1 = new Persona("Perico", "Palotes");
Persona persona2 = persona1;
Persona persona3 = new Persona("Perico", "Palotes");
Y volviéramos a preguntar si persona1 es igual que persona3, la respuesta sería FALSE.
Porque ahora apuntan a dos objetos distintos. No importa si tienen el mismo nombre y apellido, internamente ocupan distintas posiciones de memoria así que son dos objetos diferentes.



Vale, te he escrito media Biblia para decirte que no puedes usar el comparador == con la clase Salud
De hecho, el resto de comparaciones donde comparas los "item" tampoco van a funcionar bien, porque los item son de clase String, así que tampoco nos sirve el comparador ==  :o
Citar
   public static ArrayList<Salud> filtrados(Salud[] arrayRecords) {
      ArrayList<Salud> objetosFiltrados = new ArrayList<>();

      for(int i=0; i<arrayRecords.length; i++) {
         if(arrayRecords[ i] == arrayFiltro[ i] || arrayRecords[ i].item == arrayFiltro[ i].item || arrayRecords[ i].item == arrayFiltro[ i].item2 || arrayRecords[ i].item2 == arrayFiltro[ i].item)
            objetosFiltrados.add(arrayFiltro[ i]);
      }

      return objetosFiltrados;
   }

 >:( ¿Entonces cómo carajo podemos comparar las clases?
Hay varias formas, pero la principal es utilizar el método equals(). Este es un método especial que TODAS las clases de Java poseen.
Sí, tu clase Salud también lo tiene aunque tú no se lo hayas escrito. Es un método que todas las clases heredan automáticamente (no voy a explicar ahora herencia de clases), sin embargo, por sí solo no sirve para nada. Los programadores debemos sobreescribir dicho método para dotarlo de las instrucciones necesarias para que el computador sepa como ha de comparar los objetos de nuestra clase.

Así que nos vamos a tu clase Salud(que también requiere de otras correcciones que veremos luego) y comenzamos añadiendo lo siguiente:
Citar
class Salud {

   public final String item;
   public final String item2;
   private Salud[] arrayRecords;

   public Salud(String item, String item2){
      this.item = item;
      this.item2 = item2;
   }

   public void display(){
      System.out.println("Los record que coinciden son: " + Filtro.filtrados(arrayRecords));
   }

   public String getItem() {
      return this.item;
   }
   public String getItem2() {
      return this.item2;
   }
   
   @Override
   public boolean equals(Object objeto) {
      
   }


}
Ahí dentro de ese método, vamos a decidir como deben compararse dos objetos Salud para determinar si son iguales.
La etiqueta @Override no es obligatoria, pero si recomendable. Sirve para decirle a Java que ese método va a sobrescribir un método que se recibe por herencia, así el compilador se encargará de comprobar que lo estamos sobrescribiendo correctamente.
Además también sirve para que otros programadores que lean nuestro código, sepan enseguida que es un método heredado.

Fíjate que el método recibe como argumento un tipo de dato Object, esta es una clase especial, es la madre de TODAS las clases. De hecho, es de ella de quien las otras clases heredan el método equals() y otros más.
Esto significa que este método puede recibir un objeto que no sea de clase Salud, cosa que hemos de tener en cuenta a la hora de compararlos

Bien, ahora es cuando hemos de decidir cuándo dos objetos Salud son iguales.
A priori, lo normal sería considerar dos objetos Salud iguales, si sus dos items son también iguales.
Sin embargo, para hacer el filtrado nos basta con que al menos uno de sus items coincidan. Así que eso es lo que vamos a decidir:
- Dos objetos Salud serán iguales si al menos uno de sus items coinciden
Citar
   @Override
   public boolean equals(Object objeto) {
      
      if (objeto instanceof Salud) {
//Si objeto recibido es de clase Salud...
         //Lo instanciamos como Salud
         Salud otroObjeto = (Salud) objeto;
         //Si al menos uno de sus items coinciden, se considerarán iguales
         if (this.item.equals(otroObjeto.item) || this.item.equals(otroObjeto.item2)
               || this.item2.equals(otroObjeto.item) || this.item2.equals(otroObjeto.item2))
            return true;
         else
            return false;
//Ningún item coincide
         
      }
      else
         return false;
//Objeto recibido no es clase Salud
      
   }

Lo primero que hacemos es comprobar si el Object recibido es en realidad de clase Salud.
Si no lo es, retornamos FALSE y se acabó.
Si lo es, entonces hacemos un casting para tratarlo como un objeto Salud y pasamos a comparar sus items.
Si alguno coincide, retornamos TRUE.
Si no coincide, retornamos FALSE.

Fíjate que para compara los items, también estamos usando un método equals(). Este equals() pertenece a la clase String.
Así que para comparar cadenas String usaremos también equals(), la diferencia es que este método ya viene escrito "de fábrica" por el Sr. Java, no hace falta que también lo escribamos nosotros. Los String ya saben como han de compararse entre ellos.

Vale, pues ya tenemos nuestro método equals(), ¿cómo le damos uso?
Volvemos a la clase Filtro, al método donde hacíamos las comparaciones.
Ahora basta con comparar de esta manera:
Citar
   public static ArrayList<Salud> filtrados(Salud[] arrayRecords) {
      ArrayList<Salud> objetosFiltrados = new ArrayList<>();

      for(int i=0; i<arrayRecords.length; i++) {
         if(arrayRecords[ i].equals(arrayFiltro[ i]))
            objetosFiltrados.add(arrayRecords[ i]);

      }

      return objetosFiltrados;
   }

¿Solucionado?
Pues no, hay otro problema que no he comentado antes.
Estás usando el mismo índice para recorrer los dos arrays y comparar sus elementos.
Esto en realidad, conlleva dos problemas:

1- Hay elementos que no se comparan entre ellos. Como solo usas un índice, el elemento de la posición[ 0] del arrayRecord, solo se compara con el elemento [ 0] de arrayFiltro.
Pero no se compara con [ 1], ni con [ 2].., ni con ningún otro.

2- Como los arrays tienen longitudes distintas, se va a producir una Excepción (un error) cuando el índice intente apuntar a elementos que no existen.
arrayRecord es más grande, longitud 5, así que tiene las posiciones: [ 0], [ 1], [ 2], [ 3] y [ 4]
Pero arrayFiltro solo tiene longitud 2, o sea, posiciones [ 0] y [ 1].
Cuando el índice intente comparar las posiciones [ 2] de ambos arrays, no podrá porque arrayFiltro no tiene. Y eso interrumpirá el programa con un mensaje de error.

Ambos problemas se pueden solucionar usando dos bucles anidados
De esta forma, cada array tiene su propio índice, el cuál solo apuntará a posiciones que sí existen.
Y además, se garantizan todas las posibles comparaciones, porque por cada repetición del bucle principal, el bucle anidado hará un recorrido completo del segundo array. Así cada elemento del primer array, se comparará con TODOS los elementos del segundo array.

Citar

   public static ArrayList<Salud> filtrados(Salud[] arrayRecords) {
      ArrayList<Salud> objetosFiltrados = new ArrayList<>();

      for(int i=0; i<arrayRecords.length; i++) { //Bucle principal, recorre arrayRecord
         for (int j=0; j<arrayFiltro.length; j++) { //Bucle anidado, recorre arrayFiltro
            if(arrayRecords[ i].equals(arrayFiltro[j])) //Cada array usa su propio indice
               objetosFiltrados.add(arrayRecords[ i]);
         }   
      }


      return objetosFiltrados;
   }

Por último, volviendo a la clase Salud.
Esta clase se supone representa un "objeto de salud" y consta de dos ítems.
Vale, eso me parece bien.

Lo que no tiene sentido es que tenga como atributo un array de objetos Salud.
En el mundo real, ¿un Tensiómetro contiene dentro a su vez una serie de otros objetos como Glucosa o Gasas?
No tiene sentido, ¿verdad?
Si no lo tiene en el mundo real, tampoco lo tiene en el código.

Su método display() tampoco tiene sentido. Un objeto Salud no tiene que saber que objetos han sido filtrados y cuáles no.
Su existencia ha de ser ajena a ese tema, de eso ya se ocupa la clase Filtro.
Su método display() lo único que ha de hacer es mostrar los datos de ESTE(this) objeto, lo que pase con otros objetos ajenos a él, ni le va ni le viene.
Citar
class Salud {

   public final String item;
   public final String item2;
   private Salud[] arrayRecords;

   public Salud(String item, String item2){
      this.item = item;
      this.item2 = item2;
   }

   public void display(){
      System.out.println("Los record que coinciden son: " + Filtro.filtrados(arrayRecords));
   }

   public String getItem() {
      return this.item;
   }
   public String getItem2() {
      return this.item2;
   }
   
   @Override
   public boolean equals(Object objeto) {
      
      if (objeto instanceof Salud) { //Si objeto recibido es de clase Salud...
         //Lo instanciamos como Salud
         Salud otroObjeto = (Salud) objeto;
         //Si al menos uno de sus items coinciden, se considerarán iguales
         if (this.item.equals(otroObjeto.item) || this.item.equals(otroObjeto.item2)
               || this.item2.equals(otroObjeto.item) || this.item2.equals(otroObjeto.item2))
            return true;
         else
            return false; //Ningún item coincide
         
      }
      else
         return false; //Objeto recibido no es clase Salud
      
   }

}

Mejor dejarlo así:
Citar
class Salud {

   public final String item;
   public final String item2;

   public Salud(String item, String item2){
      this.item = item;
      this.item2 = item2;
   }

   public void display(){
      System.out.println("Item 1: " + this.item + " -- Item 2: " + this.item2);
   }

   public String getItem() {
      return this.item;
   }
   public String getItem2() {
      return this.item2;
   }
   
   @Override
   public boolean equals(Object objeto) {
      
      if (objeto instanceof Salud) { //Si objeto recibido es de clase Salud...
         //Lo instanciamos como Salud
         Salud otroObjeto = (Salud) objeto;
         //Si al menos uno de sus items coinciden, se considerarán iguales
         if (this.item.equals(otroObjeto.item) || this.item.equals(otroObjeto.item2)
               || this.item2.equals(otroObjeto.item) || this.item2.equals(otroObjeto.item2))
            return true;
         else
            return false; //Ningún item coincide
         
      }
      else
         return false; //Objeto recibido no es clase Salud
      
   }

}

Y con todos estos cambios, el programa ya corre y parece cumplir con lo que se le ha pedido.

Siento si he escrito demasiado, pero corregir sin explicar motivos, sería una oportunidad perdida para aprender.

Revísalo con calma todo y pregunta lo que necesites.
Un saludo.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

novatada1

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 7
    • Ver Perfil
Re: Ejercicios de Java
« Respuesta #6 en: 29 de Julio 2022, 16:07 »
Eres asombroso! De verdad agradezco mucho que te tomes el tiempo de explicarme esto y de seguro le servira a mucha gente como yo. Si me permites te pedire otro favor, dame un tiempo para corregirlo entonces, entendi tus codigos pero no los he usado para mi asignacion. Aun tengo una semana. Trabajare en ellos y te los dejare aqui a ver que opinas si esta bien contigo.

Creo que entedi el enunciado del 2do ejercicio mal  basado en tu interpretacion, pero supongo que es a proposito que hagan los enunciados tan vagos a ver que tanto "investiga"  uno. No he culminado siquiera con la cuestion esa del lambda pero muchos de los recursos de internet tienen eso y es como una manera resumida de escribir el codigo, hice una funcion que filtra una letra y creo que podria usarla para este ejercicio pero me va a tocar probar porque la verdad el bombillito del intellij compilador cambio lo que escribi y solo funciona pero aun no se porque. Asi que si puedes por favor, echame un vistazo en una semana a ver si hice los ejercicios bien. De verdad aprecio mucho toda tu ayuda!

novatada1

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 7
    • Ver Perfil
Re: Ejercicios de Java
« Respuesta #7 en: 29 de Julio 2022, 17:58 »
 :o Funciona!!!!!  :o a ver mira esto para el primer ejercicio. Como estamos poniendo valores true or false para saber si alguien entrego o no, solo se devuelve un array de positivos para los que tengan ese status. Ahora el detallazo es que es un ArrayList. Cuenta todavia con que sigue siendo un array?

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

public class Main {
    public static void main(String[] args) {
        Estudiante[] arrayEstudiantes = new Estudiante[]{
                new Estudiante("Klauss", "Hargreeves", true),
                new Estudiante( "Kimiko", "Miyashiro", true),
                new Estudiante( "Rina", "Inverse", false),
                new Estudiante( "Rei", "Ayanami", true),
                new Estudiante( "Robin", "Buckley", false),
                new Estudiante( "Dustin", "Henderson", true),
        };

        ArrayList<Estudiante> lista = siEntregaron(arrayEstudiantes);

        for(Estudiante entregaron : lista) {
            entregaron.mostrar();
        }

    }

    public static ArrayList<Estudiante> siEntregaron(Estudiante[] arrayEst) {
        ArrayList<Estudiante> positivos = new ArrayList<>();
        for(Estudiante s : arrayEst) {
            if(s.getSubmit()) positivos.add(s);
        }

        return positivos;
    }
}


class Estudiante{
    public final String nombre;
    public final String apellido;
    public final boolean submit;

    public Estudiante(String nombre, String apellido, boolean submit){
        this.nombre = nombre;
        this.apellido = apellido;
        this.submit = submit;
    }

    public void mostrar(){
        System.out.println("Nombre Estudiante: " + nombre +
                " " + apellido +
                " Entrego asignacion: " + (this.submit ? "si" : "no") );
    }

    public boolean getSubmit() {
        return this.submit;
    }
}

PS: Sigo con el del filtro pero tengo que reestructurarlo en base a lo que dijiste, oh y disculpa la falta de acentos, este teclado esta en ingles. Gracias!!!

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re: Ejercicios de Java
« Respuesta #8 en: 29 de Julio 2022, 19:32 »
Perfecto  ;)


Sobre la interpretación que yo hice del segundo ejercicio, pues eso, una interpretación.
La tuya también puede ser válida.
Tú conserva ambas soluciones, porque al margen de la interpretación dada, ambas han servido para ver cosas interesantes.
En la mía se puede ver manejo de cadenas String con split() y contains().
En la tuya hemos visto como hacer un método equals() para poder comparar objetos de clase.
Todo eso es conocimento valioso.

Sobre las expresiones lambda, son estupendas sí, pero cuando se está aprendiendo no son ideales porque no se ve de forma clara la lógica que se está aplicando.
Así que primero aprender a desarrollar lógicas y ya luego en el futuro, aprender a simplificar código con las expresiones lambda.
Para ser sincero, yo rara vez las uso.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

novatada1

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 7
    • Ver Perfil
Re: Ejercicios de Java
« Respuesta #9 en: 02 de Agosto 2022, 19:09 »
NOTA: creo que no habia refrescado la pagina y me salte una respuesta , la revisare y seguire trabajando en esto. Gracias!!!

Ok Kabuto, no pude avanzar mucho creo, estos enunciados son muy vagos y no soy la unica que esta padeciendo con esto, lo discuti con otro  compa;ero que esta en las mismas y el me dijo que para el segundo enunciado tengo que tener 2 arrays, uno con varios registros y uno que voy a usar como filtro y tienen que ser diferentes. El esta intentando con un hashmap.

El enunciado dice "Filtrar Registros- dado un array de objetos de salud y un objeto filtro, retorna todos los record que coinciden con al menos un filtro" y de alli solo retornar el que coincida con al menos uno, el problema es que no me corre con arrays. Hice esto de guia:

Código: [Seleccionar]
List<String> list = new ArrayList<>();
list.add("Colesterol");
list.add("Temperatura");
list.add("Oxigeno");
list.add("Presion Arterial");
list.add("Azucar en la Sangre");
list.add("Glucosa");
list.add("Termometro");
list.add("Tensiometro");
List<String> filters = new ArrayList<>();
filters.add("Gasa");
filters.add("Suturas");
filters.add("Tensiometro");
System.out.println("Original List " + list);

list.removeAll(filters);
System.out.println("Filtered List " + list);

Estoy usando esto como guia porque en mi caso deberia negarlo, en vez de eliminar el filtro, quiero que elimine todo lo que no sea al menos un dato del filtro no? mi pregunta es, como escribo un array lleno? tipo
Array = [objeto,1,2,3,4,5,6];

es posible? o tengo que hacer lo mismo que estaba intentando con el de la clase salud? porque estaba retomandolo y voy asi :

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

public class Filtro {

    public static Salud[] arrayFiltro;

    public static void main(String[] args) {
        Salud[] arrayRecords = new Salud[]{
                new Salud("Sangre", "Colesterol"),
                new Salud("Termometro", "Temperatura"),
                new Salud("Oximetro", "Oxigeno"),
                new Salud("Tensiometro", "Presion Arterial"),
                new Salud("Glucosa", "Azucar en la Sangre"),

        };

        arrayFiltro = new Salud[]{
                new Salud("Gasa", "Suturas"),
                new Salud("Tensiometro", "Alcohol")
        };

        ArrayList<String> filtrados = !Arrays.stream(arrayRecords).filter(arrayFiltro);
    }

    class Salud {
        public final String item;
        public final String item2;


        public Salud(String item, String item2) {
            this.item = item;
            this.item2 = item2;
        }

        public void mostrar() {
            System.out.println("Records que coinciden: " + item + ", " + item2);
        }
    }

}

Entregue el lambda que te comente y no me lo han devuelto lo cual espero que este bien pero no se como funciona  ??? y quisera hacerlo funcionar por aqui. Esto fue lo que hice de una expresion previa que filtraba solo una letra, solo cambie la letra por x siendo x my array de filtro
Código: [Seleccionar]
recordSalud.removeIf(x-> !filter.contains(x));
return recordSalud;

que me recomiendas?
« Última modificación: 02 de Agosto 2022, 19:11 por novatada1 »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re: Ejercicios de Java
« Respuesta #10 en: 03 de Agosto 2022, 18:05 »
Hola.
Esta linea no puede funcionar así:
Código: [Seleccionar]
ArrayList<String> filtrados = !Arrays.stream(arrayRecords).filter(arrayFiltro);
Dentro del método filter() no puedes pasarle un array primitivo y esperar a que la clase Arrays sepa qué tiene que hacer con él.

El método filter() lo que espera recibir es un "predicado", es decir, un objeto de la clase Predicate que le diga cuáles son la reglas de filtrado.

Y además el resultado de todo ese proceso, sería un Stream<Salud> no un ArrayList<String>

Vamos por partes.

Recuperamos la clase Salud a la que le escribimos un método equals() y un método toString().
Ambos van a resultar muy útiles a la hora de crear un Stream filtrando con un "predicado" y hacer que se muestre en pantalla.
Código: [Seleccionar]
public class Salud {

public final String item;
public final String item2;

public Salud(String item, String item2){
this.item = item;
this.item2 = item2;
}

@Override
public String toString() {
return String.format("Items del objeto: %s -- %s", item, item2);
}

@Override
public boolean equals(Object objeto) {

if (objeto instanceof Salud) { //Si objeto recibido es de clase Salud...
//Lo instanciamos como Salud
Salud otroObjeto = (Salud) objeto;
//Si al menos uno de sus items coinciden, se considerarán iguales
if (this.item.equals(otroObjeto.item) || this.item.equals(otroObjeto.item2)
|| this.item2.equals(otroObjeto.item) || this.item2.equals(otroObjeto.item2))
return true;
else
return false; //Ningún item coincide
}
else
return false; //Objeto recibido no es clase Salud
}
}

Ahora vamos a crear un "predicado", o sea una clase que implemente la interfaz Predicate
Es en esta clase donde vamos a indicar el tipo de dato que se ha de filtrar (clase Salud) y cuál es la regla de filtrado:
Código: [Seleccionar]
import java.util.function.Predicate;

public class FiltroPredicado implements Predicate<Salud> {

private Salud[] filtros; //Este será el array de los objetos de salud que hacen de filtro

public FiltroPredicado(Salud[] arrayDeFiltros) {
filtros = arrayDeFiltros;
}

@Override
public boolean test(Salud objetoSalud) {
//Con bucle comprobamos si el objeto salud coincide con algún filtro
for (Salud filtro: filtros)
if (filtro.equals(objetoSalud))
return true;
//Bucle FOR no ha devuelto TRUE, así que NO coincide con ningún filtro
return false;
}

}
La explico.
Tiene como atributo un array de objetos Salud que serán los que harán de filtros.
Este array se va a recibir por el constructor.

Luego hay un método llamado test(). Se ha de llamar así porque es un método heredado al implementar la interfaz Predicate (una interfaz es algo parecido a una clase). Esta interfaz la escribió el Sr. Java (el Sr. Java es un ente abstracto inventado por mí xD ) y decidió que ese método se ha de llamar test(), así que es lo que hay...

Cuando le pasemos este predicado a Arrays.stream().filter(), aquí filter() se va a fijar en qué dice test() sobre cómo hay que filtrar los objetos Salud.
Y ahí estamos diciendo que los objetos Salud del Stream, han de ser comparados con los objetos del array de filtros.
Esta comparación va a funcionar según lo que hemos escrito en el método equals() de la propia clase Salud

Como puedes ver, todo está conectado. El filtrado se hace según lo que diga el predicado y el predicado se apoya en lo que le dicen los propios objetos salud acerca de cómo se comparan entre ellos mismos.


Vale, tenemos la clase Salud y una clase que implementa Predicate.
¿Cómo hacemos ahora para filtrar y mostrar el resultado en pantalla?

Pues nos va a bastar con una sola línea, un poco larga eso sí:
Citar
import java.util.Arrays;

public class Filtro {

   public static Salud[] arrayFiltro;

   public static void main(String[] args) {
      Salud[] arrayRecords = new Salud[]{
            new Salud("Sangre", "Colesterol"),
            new Salud("Termometro", "Temperatura"),
            new Salud("Oximetro", "Oxigeno"),
            new Salud("Tensiometro", "Presion Arterial"),
            new Salud("Glucosa", "Azucar en la Sangre"),

      };

      arrayFiltro = new Salud[]{
            new Salud("Gasa", "Suturas"),
            new Salud("Tensiometro", "Alcohol")
      };

      Arrays.stream(arrayRecords).filter(new FiltroPredicado(arrayFiltro)).forEach(System.out::println);
      
   }
}

Fíjate que bonito el programa principal: declaramos un array, luego otro y después con una sola línea hacemos un filtrado y se muestra el resultado en pantalla.
Y fin.

Pero claro, previamente hemos tenido que escribir una clase Predicate y a nuestra clase Salud hemos tenido que dotarla de los métodos equals() y toString()
Sin este trabajo previo, esa línea tan bonita no serviría para nada.

Pruébalo y comenta si algo no se entiende.
« Última modificación: 03 de Agosto 2022, 18:09 por Kabuto »
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

novatada1

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 7
    • Ver Perfil
Re: Ejercicios de Java
« Respuesta #11 en: 04 de Agosto 2022, 16:09 »
 :-[ estoy leyendo sobre lo del predicate, no se como pude omitirlo sale alli en internet pero pense que era solo un parametro que uno ponia como  un dato. Lo haces ver muy facil pero de verdad no lo es. Agradezco mucho toda tu asistencia, en serio creo que he aprendido mas contigo que en lo que llevo batallando sola con estas cosas. Muchisimas gracias Kabuto!

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re: Ejercicios de Java
« Respuesta #12 en: 04 de Agosto 2022, 18:20 »
Lo haces ver muy facil pero de verdad no lo es.
Sí que lo es.
Pero claro, se necesita tiempo para aprender y familiarizarse con la programación en general, y en este caso, con Java en particular.

Estas cosas no se aprenden en dos semanas, ni en cuatro..., ni en seis meses...
Podemos memorizar las instrucciones y utilizarlas aún sin entender del todo cómo y por qué funcionan.
Pero pasado un tiempo, es cuando empezamos a asimilar ese conocimiento, a comprenderlo. Y es entonces cuando nos damos cuenta de que es la cosa más simple y sencilla del mundo.

Por cierto, si nuestro "predicado" fuera un poco más sencillo, si podríamos haberlo creado con una expresión lambda sin tener que escribir una clase completa.

Suponiendo que el filtro fuera un único objeto Salud, no un array, podríamos haberlo hecho así:
Citar
public class Filtro {

   public static void main(String[] args) {
      Salud[] arrayRecords = new Salud[]{
            new Salud("Sangre", "Colesterol"),
            new Salud("Termometro", "Temperatura"),
            new Salud("Oximetro", "Oxigeno"),
            new Salud("Tensiometro", "Presion Arterial"),
            new Salud("Glucosa", "Azucar en la Sangre"),

      };
      
      Salud filtroUnico = new Salud("Tensiometro", "Alcohol");

      Arrays.stream(arrayRecords).filter(a -> a.equals(filtroUnico)).forEach(System.out::println);

      
   }
}


Pero en nuestro caso, sí necesitamos un array con varios filtros con los que comparar, y para ello se necesita que intervenga un bucle.

Aunque, ahora que lo pienso... :o también podríamos haberlo hecho así:

Citar
public class Filtro {

   public static Salud[] arrayFiltro;

   public static void main(String[] args) {
      Salud[] arrayRecords = new Salud[]{
            new Salud("Sangre", "Colesterol"),
            new Salud("Termometro", "Temperatura"),
            new Salud("Oximetro", "Oxigeno"),
            new Salud("Tensiometro", "Presion Arterial"),
            new Salud("Glucosa", "Azucar en la Sangre"),

      };

      arrayFiltro = new Salud[]{
            new Salud("Gasa", "Suturas"),
            new Salud("Tensiometro", "Alcohol")
      };
      
      for (Salud filtro: arrayFiltro)
         Arrays.stream(arrayRecords).filter(a -> a.equals(filtro)).forEach(System.out::println);

      
   }
}
De esta forma tampoco necesitamos crear una clase Predicate.
Basta con poner un bucle que recorrar el array de filtros, y cada filtro de ese array se lo pasamos a la expresión lambda..
Y solucionado  ;D

Esto es lo que más me gusta de la programación. Que hay muchas formas de conseguir un mismo objetivo, y a poco que te pares a pensar, vas encontrando maneras más sencillas y con menos código de hacer lo mismo.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

 

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