Test Foro de elhacker.net SMF 2.1

Programación => Programación General => Java => Mensaje iniciado por: paablitto10 en 26 Abril 2019, 14:13 PM

Título: Ayuda con codigo Java
Publicado por: paablitto10 en 26 Abril 2019, 14:13 PM
no se como realizar un codigo en java. Tengo un String o ArrayList llamando Poderes donde estan dentro : Arco,Inteligencia,fuerza y pocima. Otro String o ArrayList llamado Miguel con : inteligencia,paciencia. Y por ultimo uno llamado Agus con : pocima,inteligencia y invisibilidad.

Tengo que comparar el primer string sobre los otros dos y debe salir esto por pantalla:

Arco-Apariciones : 0, Fuerza-Apariciones : 0, Inteligencia-Apariciones : 2, Pocima-Apariciones : 1
Título: Re: Ayuda con codigo Java
Publicado por: srWhiteSkull en 27 Abril 2019, 02:54 AM
Lo mejor Pablito es que aprendas fundamentos de la programación y luego programación orientada a objetos aplicado a Java.

Quizás es mejor que aprendas Python y luego cuando sepas programar bien Python saltes a otros lenaguajes con Java o C++ si estás pensando en el desarrollo de aplicaciones de escritorio o programación de videojuegos.

Título: Re: Ayuda con codigo Java
Publicado por: WHK en 27 Abril 2019, 04:36 AM
Cada jugador supongo que debiera estar en una lista de tipo List<>(), entonces para sumar haces una iteración por cada uno y sumas las propiedades, donde la suma total es almacenada en una variable de la clase actual que está procesando todo, así obtendrás las sumas de manera dinámica.

Saludos.
Título: Re: Ayuda con codigo Java
Publicado por: Beginner Web en 27 Abril 2019, 05:19 AM
A mi me surgió una duda acerca de su problema, soy novata en Java y queria saber si se puede modificar el valor de un objeto sin Generics en ArrayList por ejemplo esto

Código (java) [Seleccionar]
List lista = new ArrayList();

lista.add(1);//<-¿Este valor se puede incrementar?
lista.add(cualquierCosa);





Y con respecto al problema en general si debería leer algo de Programación Orientada a Objetos, yo igual soy novata asi que hice esto

Código (java) [Seleccionar]
package aplicacion.test;

import aplicacion.modelo.dominio.Habilidad;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
*
* @author Ana Kéldysh
*/
//Clase Principal que contiene el método main
public class Principal {
    //Declaración del método main
    public static void main(String[] args) {
        List<Habilidad> poderes = new ArrayList<>();
        List Miguel = new ArrayList();
        List Agus = new ArrayList();
       
        poderes.add(new Habilidad("Arco", 0));
        poderes.add(new Habilidad("Inteligencia", 0));
        poderes.add(new Habilidad("Fuerza", 0));
        poderes.add(new Habilidad("Pocima", 0));
       
        Miguel.add("Inteligencia");
        Miguel.add("Paciencia");
       
        Agus.add("Pocima");
        Agus.add("Inteligencia");
        Agus.add("Invisibilidad");
       
        Principal.compararListas(poderes, Miguel);
        Principal.compararListas(poderes, Agus);
        Principal.mostrarLista(poderes);
    }
   
    public static void compararListas(List poderes, List personaje) {
        for (int i = 0; i < poderes.size(); i++) {
            for (int j = 0; j < personaje.size(); j++) {
                Habilidad a = (Habilidad) poderes.get(i);
                if (a.getNombre().equals(personaje.get(j))) {
                    a.setApariciones(a.getApariciones() + 1);
                }
            }
        }
    }
   
    public static void mostrarLista(List poderes) {
        for (int i = 0; i < poderes.size(); i++) {
            if (i < poderes.size() - 1) {
                System.out.print(poderes.get(i) + ", ");
            } else {
                System.out.println(poderes.get(i));
            }
        }
    }
   
}



Código (java) [Seleccionar]
package aplicacion.modelo.dominio;

/**
*
* @author Ana Kéldysh
*/
public class Habilidad {
    private String nombre;
    private int apariciones;
   
    public Habilidad(){
    }

    public Habilidad(String nombre, int apariciones) {
        this.nombre = nombre;
        this.apariciones = apariciones;
    }

    public String getNombre() {
        return nombre;
    }

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

    public int getApariciones() {
        return apariciones;
    }

    public void setApariciones(int apariciones) {
        this.apariciones = apariciones;
    }

    @Override
    public String toString() {
        return nombre + "-Apariciones: " + apariciones;
    }

   
       
}


Título: Re: Ayuda con codigo Java
Publicado por: WHK en 27 Abril 2019, 05:28 AM
Con respecto a:

    List lista = new ArrayList();
     
    lista.add(1);//<-¿Este valor se puede incrementar?
    lista.add(cualquierCosa);


Puedes hacer un:

lista.set(0, ++lista.get(0));

Donde set actualiza el valor siempre y cuando sepas cual es el índice de tu item, en mi caso puse 0 porque es el primer item, luego obtiene el item y le hace un ++ al lado derecho. Podría haber hecho un .get(0) + 1 pero era más elegante y usaba menos caracteres hacer un incremento de valor y retorno simultáneo. Cuando defines un valor++ autoincrementa el valor sobre si mismo, pero cuando haces un ++valor retorna el valor sumado.

Saludos.
Título: Re: Ayuda con codigo Java
Publicado por: rub'n en 27 Abril 2019, 16:05 PM
Cita de: Beginner Web en 27 Abril 2019, 05:19 AM
A mi me surgió una duda acerca de su problema, soy novata en Java y queria saber si se puede modificar el valor de un objeto sin Generics en ArrayList por ejemplo esto

Código (java) [Seleccionar]
List lista = new ArrayList();

lista.add(1);//<-¿Este valor se puede incrementar?
lista.add(cualquierCosa);


Si podrías incrementarlo como lo tienes en el código con

Código (java) [Seleccionar]
listaInteger.set(0, listaInteger.get(0) + 1);

O, tomando lo que dice WHK, pero no exactamente así, sino

Código (java) [Seleccionar]
Integer value = (Integer) listaInteger.get(0); //cast debido a falta de tipo parametrizado
++value;  //Operador de preincremtento, tambien con postIncremento value++;
listaInteger.set(0, value);


Importante

en versiones anteriores a java 5, tu podías escribir tranquilamente ese tipo de lineas

Código (java) [Seleccionar]
List lista = new ArrayList();

y tener la esperanza de que los programadores que usen tu código, recuerden que tu quieres, únicamente Objetos Integer en ella.

Eso requiere un poco de análisis mental y tiempo, no se tendría una vía especifica para conocer el nombre esperado, es decir, si sera un Integer, Double, o hasta, String a StringBuilder.

desde Java 5, tu puedes documentar logrando una interpretación mas fácil a los demás, ese feature se llama generics, el compilador incluso ayuda a que cumplas esa suposición

quedando


Código (java) [Seleccionar]
List<Integer> lista = new ArrayList<Integer>();

Cuando la versión java 7 se libero, se logro una versión mas corta,

Código (java) [Seleccionar]
List<Integer> lista = new ArrayList<>();

la forma resumida, utiliza el operador diamante, se llama así porque <>, parece un diamante si inclinas tu cabeza a un lado.


Mira la diferencia, de esta linea

Código (java) [Seleccionar]
final HashMap<String, HashMap<String, String>> map1 = new HashMap<String, HashMap<String, String>>();

A esta linea

Código (java) [Seleccionar]
final HashMap<String, HashMap<String, String>> map2 = new HashMap<>();

Ambas declaraciones contienen maps anidados, la segunda linea es mas fácil de leer, porque no contiene información redundante.


El uso de tipos parametrizados

Código (java) [Seleccionar]
public static void mostrarNombres(List lista) {
      for(int f=0; f<lista.size(); f++) {
           final String nombre = (String) lista.get(f);//java.lang.ClassCastException
           System.out.println(nombre);
       }

   }

 public static void main(String ...blabla) {
      List lista = new ArrayList();
      lista.add(new StringBuilder("Ana Kéldysh"));

       mostrarNombres(lista);
 }


Si recuerdas cuando hablamos de especificar el tipo de dato, aka tipo parametrizado en la lista, para saber de que tipo sera nuestra lista, que es lo correcto de hacer

En el ejemplo de arriba la linea 3 arroja java.lang.ClassCastException , porque en la linea 12, le añadimos un StringBuilder, esperando en realidad un String en la 3, dando la excepción, todo porque la lista no contiene nada, no especifica nada.

Los Generics fixean eso, permitiendo que escribas el tipo parametrizado, de que deseas una Lista de String, logrando que el compilador tenga información para prevenir que tu causes ese problema en primer lugar;


Código (java) [Seleccionar]
List<String> names = new ArrayList<String>();
names.add(new StringBuilder("Ana Kéldysh")); // no compilara  


Tendríamos un error del compilador(tiempo de compilación) lo cual es bueno, porque te ayudara a detectar de inmediato el error, a diferencia de descubrir ese error luego.

Título: Re: Ayuda con codigo Java
Publicado por: Beginner Web en 27 Abril 2019, 21:17 PM
Me sale un error con esto

Código (cpp) [Seleccionar]
List lista = new ArrayList();
lista.add(1);
lista.set(0, ++lista.get(0));



Código (cpp) [Seleccionar]
Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - incompatible types: java.lang.Object cannot be converted to java.lang.Integer
at aplicacion.test.Principal.main(Principal.java:29)
 :huh:

Lo solucioné asi

Integer value = (Integer) lista.get(0);
Título: Re: Ayuda con codigo Java
Publicado por: srWhiteSkull en 27 Abril 2019, 21:48 PM
Indícale que vas a trabajar con enteros.

ArrayList<Integer>()
Título: Re: Ayuda con codigo Java
Publicado por: Beginner Web en 27 Abril 2019, 21:52 PM
Esta bien lo que dices pero yo quiero trabajar sin Generics  :laugh:
Título: Re: Ayuda con codigo Java
Publicado por: srWhiteSkull en 27 Abril 2019, 21:55 PM
Castea entonces
Título: Re: Ayuda con codigo Java
Publicado por: rub'n en 27 Abril 2019, 21:55 PM
Cita de: Beginner Web en 27 Abril 2019, 21:52 PM
Esta bien lo que dices pero yo quiero trabajar sin Generics  :laugh:

No se recomienda eso.
Título: Re: Ayuda con codigo Java
Publicado por: srWhiteSkull en 27 Abril 2019, 21:58 PM
De todas formas no puedes convertir un tipo primitivo en un objeto, vas a tener que usar en el casting (Integer).
Título: Re: Ayuda con codigo Java
Publicado por: WHK en 28 Abril 2019, 05:15 AM
Cita de: Beginner Web en 27 Abril 2019, 21:52 PM
Esta bien lo que dices pero yo quiero trabajar sin Generics  :laugh:

Apuesto que sabes c o c++ y quieres entrar en Java, por eso te cuesta trabajar con los objetos nativos de Java. Cada lenguaje de programación tiene su forma de trabajar y su recomendación oficial, en caso de Java se recomienda utilizar los objetos de Java y no los primitivos salvo que sea muy necesario.