2017-04-07 1 views
0

ich einige Code JavaScript von Java bin konvertieren, und ich habe in diesem Code kommen:Guava der ComparisonChain Umwandlung in JavaScript

static final Comparator<Point> compareXCoord = new Comparator<Point>() { 
    @Override 
    public int compare(Point o1, Point o2) { 
     return ComparisonChain.start(). 
       compare(o1.x, o2.x). 
       compare(o1.y, o2.y). 
       result(); 
    } 
}; 

static final Comparator<Point> compareYCoord = new Comparator<Point>() { 
    @Override 
    public int compare(Point o1, Point o2) { 
     return ComparisonChain.start(). 
       compare(o1.y, o2.y). 
       compare(o1.x, o2.x).result(); 
    } 
}; 

... 

Arrays.binarySearch(ypoints, Point.make(Double.NEGATIVE_INFINITY, ymin), 
      compareYCoord); 

scheint fair genug, da es die resultierende Aufgabe der passenden zurückkehren werden Vergleichskette.

Aber was ich nicht verstehe, ist, dass beide Methoden meiner naiven Augen scheinen genau die gleiche Sache zu tun: zurück, wenn entweder die x oder y Eigenschaften entsprechen. Der einzige Unterschied besteht darin, dass zuerst die Eigenschaft x zuerst geprüft wird, d. H. Die Reihenfolge der Prüfungen ist unterschiedlich.

Auch, wenn das stimmt, dann die Arrays.binarySearch Methode wird ypoints Elemente mit gleichen x Eigenschaften zurückgeben. Ich denke nicht, dass dies die Aufgabe ist.

So würde meine JavaScript Übersetzung sein:

function compareXCoord(p1, p2) { 
    return (p1.x === p2.x) ? p1 : 
     (p1.y === p2.y) ? p1 : undefined; 
} 

function compareYCoord(p1, p2) { 
    return (p1.y === p2.y) ? p1 : 
     (p1.x === p2.x) ? p1 : undefined; 
} 

Aber diese beiden zu return (p1.y === p2.y || p1.x === p2.x) ? p1 : undefined; vereinfacht werden könnten.

Ich glaube, ich bin sicherlich falsch verstanden, wie ComparisonChain funktioniert. Ist die Reihenfolge der Kette wichtig? Bonuspunkte für Anweisungen, wie dies in JavaScript übersetzt werden kann.

+1

Diese Komparatoren unterscheiden, wie sie vergleichen '(1, 2) 'to' (2, 1) '. 'compareXCoord' sagt' (1, 2) <(2, 1) 'und' compareYCoord' sagt '(1, 2)> (2, 1)'. –

Antwort

1

Sie müssen berücksichtigen, dass der Java Comparator Rückgabewert dreiwertig ist (d. H. Höher, niedriger oder gleich). Daher ist die Reihenfolge, in der Sie die Koordinaten vergleichen, wichtig - die Sortierung nach x ist nicht gleichbedeutend mit der Sortierung nach y zuerst.

0

Bit einer einfachen Frage jetzt weiß ich aus der Java-Dokumentation für java.utils.Arrays.binarySearch dass:

Das Array in aufsteigender Reihenfolge sortiert werden muß, entsprechend den angegebenen Komparator (wie von der Art (T [], Komparator) Methode) vor diesem Aufruf.

Die ComparisonChain s werden als Validierungen verwendet, um sicherzustellen, dass das Array von X dann Y Eigenschaften in compareXCoords und vice versa für compareYCoords sortiert ist.

Also, in JavaScript, um die Felder zu sortieren, wie Java würde durch Arrays.binarySearch(ypoints, Point.make(Double.NEGATIVE_INFINITY, ymin), compareYCoord); in der Frage Code zu erwarten, für compareXCoord und compareYCoord jeweils:

function sortPointsByXCoords(points) { 
    return points.sort((a, b) => a.x - b.x || a.y - b.y); 
} 

function sortPointsByYCoords(points) { 
    return points.sort((a, b) => a.y - b.y || a.x - b.x); 
}