Dado este input
5
12 0 1 78 12
2
Insert
5 23
Delete
0
Donde 5 es el número de enteros que tendrá la línea siguiente y 2 el número de instrucciones que tendrás que ejecutar sobre esa lista de enteros pudiendo ser estas o Insert (índice. valor) o Delete (índice), mi código es el siguiente:
package com.HackerRank;
import java.util.*;
public class Solution {
public static void main(String[] args) {
final Scanner sc = new Scanner(System.in);
final List<Integer> listOfIntegers = new ArrayList<Integer>();
int n = sc.nextInt();
for (int i = 0; i < n; i++)
listOfIntegers.add(sc.nextInt());
n = sc.nextInt();
for (int i = 0; i < n; i++) {
final Perform perform = "Insert".equals(sc.next()) ? (x) -> x.add(sc.nextInt(), sc.nextInt()) : (x) -> x.remove(sc.nextInt());
perform.action(listOfIntegers);
}
listOfIntegers.forEach(k -> System.out.print(k + " "));
sc.close();
}
interface Perform {
void action(List<Integer> listOfIntegers);
}
}
Como el ejercicio en sí no tenía mucha chicha y estoy intentando habituarme a normalizar el uso de lambdas, lo he planteado así. El problema que me encuentro es que a pesar de que a priori debería de hacerlo bien, el programa se me queda pillado. Le he pasado el debugger y hace una iteración extraña en el "else" del operador ternario y como es un código delicado en el sentido de ir adquiriendo valores en orden, la duda es cómo itera exactamente el operador ternario ya que haciéndolo así:
package com.HackerRank;
import java.util.*;
public class Solution {
public static void main(String[] args) {
final Scanner sc = new Scanner(System.in);
final List<Integer> listOfIntegers = new ArrayList<Integer>();
int n = sc.nextInt();
for (int i = 0; i < n; i++)
listOfIntegers.add(sc.nextInt());
n = sc.nextInt();
for (int i = 0; i < n; i++) {
final Perform perform;
if ("Insert".equals(sc.next()))
perform = (x) -> x.add(sc.nextInt(), sc.nextInt());
else
perform = (x) -> x.remove(sc.nextInt());
perform.action(listOfIntegers);
}
listOfIntegers.forEach(k -> System.out.print(k + " "));
sc.close();
}
interface Perform {
void action(List<Integer> listOfIntegers);
}
}
que en principio debería ser lo mismo, no me da ningún problema ni se queda pillado. ¿Hace dos checks o algo así? Lo he intentado buscar por mi cuenta pero lo único que encuentro son explicaciones de cómo funciona el operador en sí.