Autor Tema: Programa en Java emparejamiento de equipos crear diseño  (Leído 19044 veces)

omaza1990

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 13
    • Ver Perfil
Voy a empezar a desarrollar un pequeño programa en entorno Bluej (JAVA) que diseñará lo siguiente:
Pedira un numero X de articulos (en este caso: equipos de futbol) y los emparejará aleatoriamente de dos en dos, y si el numero X es impar, un equipo quedará exento.
Ejemplo:
Inserta el numero de equipos: 7
Inserta el equipo numero 1: Real Madrid
Inserta el equipo numero 2: Dortmund
Inserta el equipo numero 3: Sevilla
Inserta el equipo numero 4: Betis
Inserta el equipo numero 5: Wolfsburgo
Inserta el equipo numero 6: Lazio
Inserta el equipo numero 7: Roma
Emparejamientos definitivos aleatoriamente:
Dortmund vs Betis
Lazio vs Wolfsburgo
Roma vs Real Madrid
Exento: Sevilla

¿cómo podría empezar a plantearmelo para codificarlo... uso arrays algunas pistas?
« Última modificación: 13 de Septiembre 2014, 19:09 por Alex Rodríguez »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:Programa en Java con Bluej
« Respuesta #1 en: 03 de Julio 2014, 14:58 »
Te doy un posible enfoque para el problema:

Las clases a definir serían (algunas clases las podrías omitir si quieres):

Equipo: clase donde se define un equipo con sus atributos y métodos

ListaEquipos: clase con un atributo que es un ArrayList con una lista de equipos.

Emparejamiento: clase que tiene dos atributos que son los equipos de que consta un emparejamiento. Si el segundo equipo es null significará que es el último equipo (caso de número impar, equipo que queda sin pareja)

ListaEmparejamientos: clase que tiene un atributo que es un ArrayList de Emparejamientos.

Emparejador: clase que recibe un ArrayList de objetos Equipo, es decir, una ListaEquipos, y se encarga de crear los emparejamientos y devolver un ArrayList de objetos Emparejamiento.

Programa: clase con el método main, donde se crean y definen los objetos Equipo y se añaden a un objeto ListaEquipos y donde se crea un objeto Emparejador que se encarga de recibir la lista de equipos y devolver la lista de emparejamientos.

Todo esto siguiendo los criterios de programación orientada a objetos expuestos en el curso http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=68&Itemid=188

También se puede resolver de otras maneras, por ejemplo como dices tú con arrays o con otros diseños de orientación a objetos.

Saludos,

omaza1990

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 13
    • Ver Perfil
Re:Programa en Java con Bluej
« Respuesta #2 en: 03 de Julio 2014, 15:01 »
de la forma explicada es la correcta, pero yo no tengo dominio en ArrayList y tenia pensaro realizar todo "alborotadamente", todo en un mismo programa ejecutador (main). Sé que estaría mal pero para empezar... igual mejor, me podrías avanzar un poco como se crearía el arrayList... tendría que manejar el operador % para comprobar si es par o impar, y tambien el metodo random

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:Programa en Java con Bluej
« Respuesta #3 en: 03 de Julio 2014, 15:11 »
Para empezar lo mejor sería que fueras paso a paso asimilando los conceptos básicos de Java hasta llegar a los ArrayList y el diseño de clases orientado a objetos. Si no sabes lo que es un ladrillo es difícil construir un edificio  ;D No es difícil, pero requiere tiempo. Lo puedes conseguir siguiendo el curso que te indiqué y con la ayuda que se obtiene en estos foros. Si no vas paso a paso, el edificio se te caerá  ::)

omaza1990

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 13
    • Ver Perfil
Re:Programa en Java con Bluej
« Respuesta #4 en: 03 de Julio 2014, 15:41 »
tienes skype o email para comentarlo rapidamente y pasarte codigo y puedas corregir correctamente?

omaza1990

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 13
    • Ver Perfil
Re:Programa en Java con Bluej
« Respuesta #5 en: 03 de Julio 2014, 15:55 »
De momento lo que estoy intentando es poner un numero X y asignar numeros aleatorios (sin repetir) desde el 1 hasta el X pero me da fallo por ArrayIndexOutOfBoundsException, creo que supere el limite del array.
El programa es el siguiente:
import java.util.*;
public class prueba
{
    public static void main (String[] args) {
        int numero, i=0;
        Scanner teclado = new Scanner(System.in);
        System.out.print("Inserta el numero de elementos: ");
        numero = teclado.nextInt();
        int[] array = new int [numero];
        //int i=0, j;
       
        array=(int)(Math.random()*numero);
       
        for(i=1;i<=numero;i++) {
            array=(int)(Math.random()*numero);
            for(int j=0;j<i;j++) {
                    if(array==array[j]) {
                        i--;
                    }
            }   
        }
       
        for(i=1;i<=numero;i++) {
            System.out.print(" "+array[numero]);
        }
    }
}

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:Programa en Java con Bluej
« Respuesta #6 en: 03 de Julio 2014, 16:04 »
Los moderadores del foro no respondemos por email ni skype, tendríamos que estar las 24 horas sin hacer otra cosa  :o

Para pegar código pulsa el botón # del editor del foro y pega el código entre las etiquetas [ code ] ... [ / code ] luego pulsa previsualizar y si sale bien dale a publicar. Si no lo haces así el código no se visualiza correctamente debido a que ciertos caracteres se identifican como etiquetas internas del editor.

omaza1990

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 13
    • Ver Perfil
Re:Programa en Java con Bluej
« Respuesta #7 en: 03 de Julio 2014, 16:11 »
Código: [Seleccionar]
import java.util.*;
public class prueba
{
    public static void main (String[] args) {
        int numero, i=0;
        Scanner teclado = new Scanner(System.in);
        System.out.print("Inserta el numero de elementos: ");
        numero = teclado.nextInt();
        int[] array = new int [numero];
        //int i=0, j;
       
        array=(int)(Math.random()*numero);
       
        for(i=1;i<=numero;i++) {
            array=(int)(Math.random()*numero);
            for(int j=0;j<i;j++) {
                    if(array==array[j]) {
                        i--;
                    }
            }   
        }
       
        for(i=1;i<=numero;i++) {
            System.out.print(" "+array[numero]);
        }
    }
}

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:Programa en Java con Bluej
« Respuesta #8 en: 04 de Julio 2014, 10:37 »
Esta línea es incorrecta: array=(int)(Math.random()*numero);

Si lo que pretendes es rellenar el array con valores enteros aleatorios, tienes que recorrer el array con un bucle y en cada pasada del bucle generar un número aleatorio y asignárselo al elemento del array.

Aquí tienes un ejemplo de cómo hacerlo (el ejemplo usa ArrayList, pero con un array es básicamente lo mismo): http://aprenderaprogramar.com/index.php?option=com_content&view=article&id=638:generar-numeros-aleatorios-en-java-clase-random-y-metodo-nextint-ejercicio-ejemplo-resuelto-cu00672b&catid=68:curso-aprender-programacion-java-desde-cero&Itemid=188

Saludos

omaza1990

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 13
    • Ver Perfil
Re:Programa en Java con Bluej
« Respuesta #9 en: 08 de Julio 2014, 17:46 »
No consigo realizar el ejercicio. AYUDA!!!! Tengo que entregarlo hoy.

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:Programa en Java con Bluej
« Respuesta #10 en: 08 de Julio 2014, 19:55 »
Aunque no está estructurado en clases, aquí tienes lo que podría ser una orientación desde el comienzo (todavía falta terminarlo):

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

public class Ejercicio {

    public static void main (String [] Args){

        int numeroEquipos = 0;
        ArrayList<String> listaEquipos = new ArrayList<String> ();
        System.out.print("Por favor escribe el número de equipos: ");
        Scanner Escaner = new Scanner(System.in);
        numeroEquipos = Escaner.nextInt();
        System.out.println("Hay " + numeroEquipos + " equipos");

        String tmp = "";
        tmp = Escaner.nextLine();
        for (int i=0; i<numeroEquipos; i++) {
            System.out.print("Por favor inserta el equipo "+(i+1)+ ": ");
            tmp = Escaner.nextLine();
            listaEquipos.add(tmp);
        }

        System.out.println ("Equipos en la lista: " + listaEquipos);

    }
}

omaza1990

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 13
    • Ver Perfil
Re:Programa en Java con Bluej
« Respuesta #11 en: 09 de Julio 2014, 17:52 »
Código: [Seleccionar]
public class sorteo{
    public static void main (String args[]){
        String[] equipos = { "Equipo A", "Equipo B", "Equipo C", "Equipo D", "Equipo E", "Equipo F", "Equipo G", "Equipo H", "Equipo I" };
        List<String> emparejados = new ArrayList<String>();
        Random rand = new Random();
        int randomNum = 0;
 
        for (String equipo : equipos)
        {
            if (emparejados.size() == equipos.length-1)
                break;
               
            if (emparejados.contains(equipo))
                continue;
 
            emparejados.add(equipo);
           
            do
            {
                randomNum = rand.nextInt(((equipos.length-1) - 0) + 1) + 0;
            } while (emparejados.contains(equipos[randomNum]));
 
            emparejados.add(equipos[randomNum]);
            System.out.println(equipo + " vs " + equipos[randomNum]);
        }
 
        for (String equipo : equipos)
            if (!emparejados.contains(equipo))
                System.out.println("- Exento: " + equipo);
   }
}
Funciona pero lo malo que siempre el primer equipo el equipo A, y el segundo equipo el equipo B, los demas son aleatorios. ¿Como puedo cambiar para que la posicion 0 NO sea siempre EquipoA?

javi in the sky

  • Avanzado
  • ****
  • Mensajes: 393
    • Ver Perfil
Re:Programa en Java con Bluej
« Respuesta #12 en: 10 de Julio 2014, 10:07 »
Hola qué tal. Usando un bucle for each posiblemente siempre te empiece en el mismo orden. Tendrías que cambiar la lógica para que el bucle no empiece en el mismo orden. Aquí lo he planteado con un bucle while y cambiando algunas cosas y devuelve combinaciones aleatorias desde el principio, estableciendo que el primer equipo sea ya aleatorio:

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

public class sorteo{
    public static void main (String args[]){
        String[] equipos = { "Equipo A", "Equipo B", "Equipo C", "Equipo D", "Equipo E", "Equipo F", "Equipo G", "Equipo H", "Equipo I" };
        List<String> emparejados = new ArrayList<String>();
        Random rand = new Random();
        int randomNum = rand.nextInt(((equipos.length-1) - 0) + 1);

        int equiposExtraidos = 0;

        while (equiposExtraidos < equipos.length) {
            if (emparejados.size() == equipos.length-1)
                break;

            String equipo1="";
            do {
                randomNum = rand.nextInt(((equipos.length-1) - 0) + 1);
                equipo1 = equipos[randomNum];
            } while (emparejados.contains(equipos[randomNum]));

            emparejados.add(equipo1);

            String equipo2="";
            do {
                randomNum = rand.nextInt(((equipos.length-1) - 0) + 1);
                equipo2 = equipos[randomNum];
            } while (emparejados.contains(equipos[randomNum]));

            emparejados.add(equipo2);
            System.out.println(equipo1 + " vs " + equipo2);
            equiposExtraidos++;
        }

        for (String equipo : equipos)
            if (!emparejados.contains(equipo))
                System.out.println("- Exento: " + equipo);
    }
}

Espero te sirva

omaza1990

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 13
    • Ver Perfil
Re:Programa en Java con Bluej
« Respuesta #13 en: 10 de Julio 2014, 12:23 »
Muchas gracias por tu ayuda. Voy a analizar y comparar el caso del aleatorio desde la posicion inicial del Array.
Ahora quisiera que los equipos no sean predeterminados, sino que el usuario de la aplicación los inserte:
numeros a insertar: 5
equipo numero1: fcb
equipo numero2: rma
equipo numero3: betis
equipo numero 4: sevilla
equipo numero5: celta
celta vs rma
fcb vs betis
exento: sevilla

javi in the sky

  • Avanzado
  • ****
  • Mensajes: 393
    • Ver Perfil
Re:Programa en Java con Bluej
« Respuesta #14 en: 11 de Julio 2014, 09:49 »
Para ello puedes usar la clase Scanner tal y como está en el código que ha puesto anteriormente Alex.

Una vez tengas el número de equipos, crea el array:

String [] equipos = new String [numeroEquipos];

Y seguidamente pide el nombre de cada equipo usando un bucle. Con eso ya tienes el programa pero con un número de equipos y nombres de los equipos según introduzca el usuario.

Saludos

 

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