Ordenar lista de objetos por otra lista usando Java comparadores

simplelenz:

Thare son dos listas de entrada como sigue:

inputA = [
            {
               name: "A",
               age: 20
            }, 
            {
               name: "B",
               age: 30
            },
            {  name: "C",
               age: 25
            },
            {  name: "D",
               age: 28
            }
          ]

inputB = ["D", "B"]

Mi lista de salida preferente debe ser la siguiente:

expectedOutput = [
            {
               name: "D",
               age: 28
            }, 
            {
               name: "B",
               age: 30
            },
            {  name: "A",
               age: 20
            },
            {  name: "C",
               age: 25
            }
          ]

Lo que he hecho hasta ahora se parece a continuación:

AtomicInteger count = new AtomicInteger();
Collections.sort(inputA, Comparator
    .comparing(a -> 
    if (inputB.indexOf(a.getName()) > -1) {
        return -1;
    }
    else {
        return count.incrementAndGet();
    })
    .thenComparingInt(a -> a.getAge()));

La salida que estoy recibiendo es el siguiente

actualOutput = [
            {
               name: "D",
               age: 28
            }, 
            {
               name: "B",
               age: 30
            },
            {  name: "C",
               age: 25
            },
            {  name: "A",
               age: 20
            }
          ]

El problema es que con los elementos que no tienen su nombre en la lista inputB. Hay orden no tiene el orden original en inputA. Para el orden original de persistir { name: "A", age: 20 }debe venir antes{ name: "C", age: 25 }

¿Cómo puedo solucionar este problema durante el uso de la estrategia de encadenamiento comparador?

ACTUALIZACIÓN lógica de clasificación es, si InputA tiene objetos donde los nombres son iguales a la lista InputB, estos elementos deben llegar a la cima de la InputA y luego esos elementos deben ser ordenados por su edad, manteniendo el orden original de los otros elementos en InputA que no están presentes en InputB

Esto no es un posible duplicado, debido a esta pregunta trata de comparar dos listas y también ordenar los elementos comunes de una propiedad de un objeto a partir de la primera lista, dejando el resto de los elementos en su orden original.

Federico Peralta Schaffner:

Tal como lo veo, es necesario ordenar los elementos por edad, si el nombre está contenida en la inputBlista y dejar el resto de los elementos, ya que son si no están contenidos en la inputBlista. Los elementos ordenados por edad deben aparecer en la parte superior del resultado, mientras que los no clasificados deben aparecer en la parte inferior.

Si esto es lo que hay que hacer, se puede utilizar Comparator.comparingInty dejar que devuelve un entero que es ya sea la edad (para el primer caso) o Integer.MAX_VALUE(para el otro caso).

Usted debe optimizar el cheque inputB, de modo que sea rápido. Para esto, se podía crear una HashSetdesde inputB.

Este es el código:

Set<String> set = new HashSet<>(inputB);

Collections.sort(inputA, Comparator.comparingInt(a -> set.contains(a.getName()) ? 
                                                      a.getAge() : 
                                                      Integer.MAX_VALUE));

Estos trabajos, siempre y cuando usted no tiene una edad que es igual a Integer.MAX_VALUE.

La idea es que siempre se comparan por edad, pero si un elemento no pertenece a inputB, se enciende la edad en Integer.MAX_VALUE. Esto tendrá dos efectos: en primer lugar, que hará que los elementos no contenidos en inputBaparecer en la parte inferior; En segundo lugar, como siempre se vuelve Integer.MAX_VALUE, el orden de la inputAlista se conserva, ya que Collections.sortimplementa una ordenación estable .

Supongo que te gusta

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