Java - Cómo obtener la lista de elementos mejores en cierta condición

user1298426:
Solution{
  String question
  String answer

  public Solution(String question,String answer){
  ...
  }
}

List<Solution> solutions = new ArrayList<>();

Arrays.asList(
    new Solution("Index1","a"),
    new Solution("Index2","b"),
    new Solution("Index3","c"),
    new Solution("Index4","d"),
    new Solution("Index5","ae"),
    new Solution("Index1","afg"),
    new Solution("Index2","adfg"),
    new Solution("Index1","ag"),
    new Solution("Index2","a"),
    new Solution("Index3","a"),
    new Solution("Index4","a"),
    new Solution("Index5","a"),
    new Solution("Index1","arrr"),
    new Solution("Index2","a"),
    new Solution("Index3","a"));

Siempre quiero conseguir última dos juegos a partir de las cuales son Índice1

new Solution("Index1","ag"),
new Solution("Index2","a"),
new Solution("Index3","a"),
new Solution("Index4","a"),
new Solution("Index5","a"),
new Solution("Index1","arrr"),
new Solution("Index2","a"),
new Solution("Index3","a"))

pero no estoy seguro de cuál es la mejor manera de hacerlo. No puedo pensar en la inversión de la lista y luego tener un contador en Índice1 que comienza con 0 y luego hacer el bucle while para agregarlo en una lista hasta que el contador llega a 2. No estoy seguro si esto es posible con los arroyos.

Stuart Marcas:

Creo que la forma más sencilla es conseguir que las posiciones en las que Index1se produce en la lista de soluciones. Estos representan un potencial posición de inicio de la lista secundaria. Usted puede hacer esto mediante el uso de un IntStreamlargo de los índices en la lista de soluciones. Luego, tomar la segunda a la última como punto de partida la puesta en marcha de una lista secundaria que va al final de la lista.

    List<Integer> starts = IntStream.range(0, solutions.size())
                                    .filter(i -> solutions.get(i).getQuestion().equals("Index1"))
                                    .boxed()
                                    .collect(toList());
    if (starts.size() < 2) {
        // not sure what you want to do in this case
    } else {
        List<Solution> lastTwoSets = solutions.subList(starts.get(starts.size()-2), solutions.size());
        lastTwoSets.forEach(System.out::println);
    }

Se me ocurre que el uso de un int[]lugar de List<Integer>hace las cosas un poco más eficiente, así como un poco más concisa. El techique es de otro modo esencialmente el mismo.

    int[] starts = IntStream.range(0, solutions.size())
                            .filter(i -> solutions.get(i).question.equals("Index1"))
                            .toArray();
    if (starts.length < 2) {
        // not sure what you want to do in this case
    } else {
        List<Solution> lastTwoSets = solutions.subList(starts[starts.length-2], solutions.size());
        lastTwoSets.forEach(System.out::println);
    }

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=204397&siteId=1
Recomendado
Clasificación