Foro de elhacker.net

Programación => Java => Mensaje iniciado por: Langosta Sexual en 6 Febrero 2015, 02:22 am



Título: Ayuda de como eliminar un valor contenido en un arreglo.
Publicado por: Langosta Sexual en 6 Febrero 2015, 02:22 am
Voy a ser breve, yo veo clases con un profesor que explica bien y sabe lo que hace, pero su unico problema es que va al par con el alumno mas lento en lugar de ir avanzando acorde al conocimiento de la mayoria, ya estoy algo cansado de ir a clases de programacion a hacer programitas de "calcule la suma de dos numeros" o "calcule el producto de 2 arreglos". El dia de ayer descargue un libro llamado "Murach's java programing" para aprender por mi cuenta, libro bastante bueno pero con pocos ejercicios en el, asi que empeze a buscar por internet y encontra algunos algoritmos "faciles" y decidi empezar a hacerlos para aprender mas, les escribire el problema.

Problema:

Un negociante ocupado tiene varias tareas de igual importancia que debe completar. Para decidir cual de las varias tareas va a resolver primero el negociante elabora la siguiente operación.
El escribe en una hoja todas las tareas que debe realizar de forma circular, de forma que la primera tarea que escribió es adyacente a la ultima que escribió . El luego piensa en un numero positivo y par. Este numero es un valor cualquiera sacado de su mente que el llama “n”. comenzando desde la primera tarea, el va de tarea en tarea moviéndose en sentido de las agujas de un reloj (desde el elemento 1 de la lista, al elemento 2, al elemento 3 … etc) contando desde 1 hasta “n”. Cuando cuenta hasta “n”, el elimina esta tarea de la lista y comienza a contar desde la siguiente tarea disponible. El repite este procedimiento hasta que solo 1 tarea quede en la lista. La tarea que queda al final del procedimiento es la tarea que el va a ejecutar primero.

Ejemplo:
1)   
       Tareas{"a","b","c","d"}
N=2

Returns: "a"

Empezamos contando desde a. asi a es 1, b es 2. Eliminamos b, entonces en la lista quedan las tareas {a,c,d}. continuamos desde c. Asi que c es 1, d es 2. Eliminamos d, la lista contiene ahora {a,c}.. Continuamos desde a. Así que a es 1, c es 2. Eliminamos c, y la tarea que quedo en la lista es la tarea que va a ejecutar el negociante, a.

Este es el codigo que ya tengo escrito.

Código
  1. package tareasdenegocio;
  2. import java.util.*;
  3. public class TareasDeNegocio {
  4.  
  5.    public static void main(String[] args)
  6.    {
  7.        Scanner ec = new Scanner (System.in);
  8.        int CantidadTareas=0,Numero;
  9.        System.out.println("Introduzca la cantidad de tareas que desea calcular\n");
  10.        CantidadTareas = ec.nextInt();
  11.        String Tareas []= new String [CantidadTareas];
  12.  
  13.        for (int x=0;x<CantidadTareas;x++)
  14.        {
  15.        System.out.println("Introduzca la tarea numero "+x+"\n");
  16.        Tareas[x]=ec.nextLine();
  17.            if (x==CantidadTareas)
  18.            {
  19.            System.out.println("Introduzca un numero positivo\n");
  20.            Numero=ec.nextInt();
  21.            }
  22.        }
  23.    }  
  24. }

Si es muy poco, mis disculpas, no tengo amplios conocimientos en java, solo quiero aprender.
Por si alguien necesita la fuente de donde yo habia sacado el algoritmos, aqui esta (en ingles): http://community.topcoder.com/stat?c=problem_statement&pm=1585&rd=6535

Mod: no hagas doble post


Título: Re: Ayuda de como eliminar un valor contenido en un arreglo.
Publicado por: Usuario Invitado en 6 Febrero 2015, 03:59 am
Hay un pequeño error en el enunciado, porque siempre van a quedar 2 elementos y si el índice (n) excede de la cantidad de elementos obtendrás un ArrayOutOfBoundsException, que quiere decir que sea querido acceder a un índice mayor al límite. Es un desbordamiento.

Lo que debes hacer es una vez que quedan dos elementos, evaluar si el índice a eliminar no excede de 2, si es así que elimine el elemento situado en el índice especificado, pero si el índice excede de 2, que elimine uno de los dos. En mi caso, elegí eliminar el segundo.

Todo el proceso se hará en un bucle cuya condición será que se ejecutará mientras no quede un elemento en la lista. Cuando quede un elemento, termina.

Código
  1. public static void main(String[] xD) {
  2.        List<String> tasks = new ArrayList<>();
  3.        Collections.addAll(tasks,
  4.                "Aprender Java",
  5.                "Practicar ejercicios algor&#237;tmicos",
  6.                "Aprender buenas pr&#225;cticas de programaci&#243;n",
  7.                "Aprender a usar patrones de dise&#241;o");
  8.        System.out.print("Ingrese el &#237;ndice de las tareas a eliminar: ");
  9.        byte indexOfTaskToDelete = new Scanner(System.in).nextByte();
  10.        while(tasks.size() != 1) {
  11.            for (byte i = 0; i < tasks.size(); i++) {
  12.                if (tasks.size() == 2) {
  13.                    if(indexOfTaskToDelete == 1)
  14.                        tasks.remove(i);
  15.                    else
  16.                        tasks.remove(1);
  17.                }
  18.                else {
  19.                    if (i == indexOfTaskToDelete - 1)
  20.                        tasks.remove(i);
  21.                }
  22.            }
  23.        }
  24.        System.out.println("\nLa tarea a ejecutar es: ");
  25.        tasks.forEach(System.out::println);
  26.    }

Concretamente, ésta es la parte que evalúa si quedan dos elementos:

Código
  1. if (tasks.size() == 2) {
  2.    if(indexOfTaskToDelete == 1)
  3.        tasks.remove(i);
  4.    else
  5.        tasks.remove(1);
  6. }

Si el tamaño de la lista es igual a 2, que evalúe: Si el índice especificado es igual a i, significa que el índice especificado está en el rango del tamaño de la lista, por lo que se podrá eliminar. Si no está, elimina el segundo elemento.

Esta parte:

Código
  1. else {
  2. if (i == indexOfTaskToDelete - 1)
  3.    tasks.remove(i);
  4. }

Evalúa si el índice actual de la lista es igual al índice proporcionado - 1, que elimine la tarea. ¿Por qué -1? Por que en lenguajes de programación, listas y arreglos cuentan a partir de cero.

Perdón por esto:

Código
  1. tasks.forEach(System.out::println);

Es lo mismo que:

Código
  1. for(String task : tasks)
  2.    System.out.println(task);

La diferencia de sintaxis se debe a que la primera forma usa lambdas, una característica de Java 8.

Salu2.


Título: Re: Ayuda de como eliminar un valor contenido en un arreglo.
Publicado por: Langosta Sexual en 6 Febrero 2015, 04:39 am
Gracias por la respuesta, aunque antes de dar por resuelto el tema yo debo de estudiar mas sobre el metodo java.util.ArrayList; porque la verdad lo desconozco, una duda antes de ponerme a estudiar, se que esto que voy a escribir no compilara, pero, ¿se puede codificar algo similar para que el usuario pueda añadir las tareas a al arreglo que contiene las tareas?.

algo similar a esto (pero que compile).

Código
  1. {
  2. System.out.println("Introduzca una tarea para añadir en la lista: ");
  3.      String x;
  4.      x=ec.nextLine();
  5.      Tareas.add.(x);
  6.    }


Título: Re: Ayuda de como eliminar un valor contenido en un arreglo.
Publicado por: Usuario Invitado en 6 Febrero 2015, 04:50 am
ArrayList no es un método, es una clase que implementa la interface List. Respecto a tu otra pregunta, el código que pusiste compilaría si le quitas el "." entre add y los paréntesis. add es el método de List que te permite agregar cosas de acuerdo al tipo de dato que le has especificado.

Código
  1. tareas.add(x.nextLine());

PD: Los nombres de variables deben comenzar con minúsculas.