Comparador de Java no se puede comparar cada objeto

user3667111:

Estoy teniendo algunas complicaciones con el Java Comparator. Así que tengo un nodo padre que tiene una lista de los niños. Quiero ordenar esos niños, parece simple bonita en la cara de ella, sin embargo, cuando la Comparatorhace la clasificación que sólo el control de ciertos objetos contra ciertos objetos, entonces supongo que infiere las posiciones de los objetos, como para decir si aes antes d, fes después de d, bes antes de dque medios bes antes f.

A continuación se muestra un ejemplo de mi configuración actual. Tengo un nodo padre acon 4 nodos hijos b, e, l, g. Cuando estos niños especie, esperaría que la orden sea b, g, l, e, para ordenar alfabéticamente y siempre asegurarse de que un nodo padre es lo primero.

(Excusa el dibujo de mala calidad)

introducir descripción de la imagen aquí

Muy simple, tengo una Nodeclase, que contiene una identificación, por lo que es letra y luego una lista de los niños.

public class Node {

    private char id;
    private Node parent;
    private List<Node> children = new ArrayList<>();


    public Node(char id) {
        this.id = id;
    }

    public void addChild(Node child) {
        this.children.add(child);
    }

    public List<Node> getChildren() {
        return children;
    }

    public char getId() {
        return id;
    }

    public void setParent(Node parent) {
        this.parent = parent;
    }

    public Node getParent() {
        return parent;
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }

    @Override
    public boolean equals(Object obj) {
        return ((Node) obj).getId() == this.id;
    }
}

Entonces tengo la NodeComparatorclase que comprueba en primer lugar si los nodos son sus hijos y luego si es que van primero, a la inversa, entonces las órdenes por orden alfabético.

    @Override
    public int compare(Node o1, Node o2) {
        if (o1.getChildren().contains(o2)) {
            return -1;
        }

        if (o2.getChildren().contains(o1)) {
            return 1;
        }

        String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

        int firstNodeIndex = -10;
        int secondNodeIndex = -10;
        for (int i = 0; i < alphabet.length(); i++) {
            if (alphabet.charAt(i) == o1.getId()) {
                firstNodeIndex = i;
            }
            if (alphabet.charAt(i) == o2.getId()) {
                secondNodeIndex = i;
            }
        }
        if (firstNodeIndex > secondNodeIndex) {
            return 1;
        } else if (firstNodeIndex == secondNodeIndex) {
            return 0;
        }else {
            return -1;
        }
    }
}

El problema es que cuando se realiza la clasificación se comprueba:

E against B
G against E
L against G

Por lo que nunca comprobar L E contra lo que no tiene forma de saber que debe ser lo primero.

Eran :

Su pedido viola Comparatorcontrato 's:

El implementador también debe asegurarse de que la relación es transitiva: ((comparar (x, y)> 0) && (comparar (y, z)> 0)) implica comparar (x, z)> 0.

compare('G','E') > 0 // since 'G' comes after 'E' in the alphabet

y

compare('E','L') > 0 // since 'E' is a child of 'L'

pero

compare('G','L') < 0 // since 'G' comes before 'L' in the alphabet

Debido a que su Comparatorno es válida Comparator, es probable que el rendimiento sea una excepción o resultados inesperados.

Supongo que te gusta

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