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.
public static void main
(String[] xD
) { List<String> tasks = new ArrayList<>();
"Aprender Java",
"Practicar ejercicios algorítmicos",
"Aprender buenas prácticas de programación",
"Aprender a usar patrones de diseño");
System.
out.
print("Ingrese el índice de las tareas a eliminar: "); byte indexOfTaskToDelete
= new Scanner
(System.
in).
nextByte(); while(tasks.size() != 1) {
for (byte i = 0; i < tasks.size(); i++) {
if (tasks.size() == 2) {
if(indexOfTaskToDelete == 1)
tasks.remove(i);
else
tasks.remove(1);
}
else {
if (i == indexOfTaskToDelete - 1)
tasks.remove(i);
}
}
}
System.
out.
println("\nLa tarea a ejecutar es: "); tasks.
forEach(System.
out::println
); }
Concretamente, ésta es la parte que evalúa si quedan dos elementos:
if (tasks.size() == 2) {
if(indexOfTaskToDelete == 1)
tasks.remove(i);
else
tasks.remove(1);
}
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:
else {
if (i == indexOfTaskToDelete - 1)
tasks.remove(i);
}
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:
tasks.
forEach(System.
out::println
);
Es lo mismo que:
La diferencia de sintaxis se debe a que la primera forma usa lambdas, una característica de Java 8.
Salu2.