Java TreeSet con la longitud Comparador error?

Georgios F.:

Tengo el siguiente código que crea un TreeSet utilizando un comparador basado en longitud de la cadena.

public class TreeSetComparator {
    public static void main(String[] args) {
        SortedSet<String> sortedSet = new TreeSet<>(Comparator.comparing(String::length));
        sortedSet.addAll(Arrays.asList("aa", "bb", "aa"));
        System.out.println(sortedSet);
    }
}

Para mi sorpresa la salida de lo anterior es

[aa]

Mientras yo esperaría

[aa, bb]

o

[bb, aa]

Desaparece la parte "BB", que parece ser contrario al contrato SortedSet. El comparador se supone que sólo ordenar los elementos y no determina su singularidad, que normalmente se determina por los iguales.

Por otro lado, si mejoran la comparación para volver siempre que no sea cero para los artículos desiguales como a continuación, sólo entonces puedo obtener los resultados correctos.

    SortedSet<String> sortedSet = new TreeSet<>(Comparator.comparing(String::length).reversed().thenComparing(String::toString));
    sortedSet.addAll(Arrays.asList("aa", "bb", "aa"));
    System.out.println(sortedSet);

La salida ahora es [aa, bb]lo que cabe esperar.

Es el por encima de un error en la implementación TreeSet?

Mi entorno es el siguiente:

mvn --version                                                                                                                                            21:40:22
Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-17T19:33:14+01:00)
Maven home: /home/aaaa/.sdkman/candidates/maven/current
Java version: 10.0.2, vendor: Oracle Corporation, runtime: /usr/lib/jvm/java-10-jdk
Default locale: en_GB, platform encoding: UTF-8
OS name: "linux", version: "4.14.60-1-manjaro", arch: "amd64", family: "unix"

ACTUALIZAR

Aquí está una entrada relacionada junto con sugerencias sobre cómo solucionar el problema en una futura versión de Java: https://yesday.github.io/blog/2018/java-gotchas-sorted-set-ignores-the-equals-method .html

Marvin:

Esto no un error. Al menos no en TreeSet.

Desde el javadoc, el énfasis por mí:

Tenga en cuenta que el orden mantenido por un conjunto (si no se proporciona un elemento de comparación explícita) debe ser consistente con los iguales si se va a aplicar correctamente la interfaz Set. (Ver Comparable o Comparator para una definición precisa de consistentes con los iguales.) Esto es así debido a que la interfaz conjunto se define en términos de los Iguales operación, pero un TreeSet realiza instancia todas las comparaciones de elementos utilizando su compareTo (o comparar) método, así que dos elementos que se consideran iguales por este método son, desde el punto de vista del conjunto, la igualdad . El comportamiento de un conjunto está bien definido, incluso si su pedido es incompatible con iguales; simplemente no obedece el contrato general de la interfaz conjunto.

Así pues "aa" y "bb" ambos tienen una longitud de 2 que se consideran iguales por compareToy por lo tanto por el TreeSet.

Por definición , en consonancia con sus congéneres medios:

El orden impuesto por un comparador c en un conjunto de elementos S se dice que es consistente con los iguales si y sólo si c.compare (e1, e2) == 0 tiene el mismo valor booleano como e1.equals (E2) para cada e1 y e2 en S.

Supongo que te gusta

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