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 Comparator
hace 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 a
es antes d
, f
es después de d
, b
es antes de d
que medios b
es antes f
.
A continuación se muestra un ejemplo de mi configuración actual. Tengo un nodo padre a
con 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)
Muy simple, tengo una Node
clase, 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 NodeComparator
clase 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.
Su pedido viola Comparator
contrato '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 Comparator
no es válida Comparator
, es probable que el rendimiento sea una excepción o resultados inesperados.