我从Java转换一些代码JavaScript和我碰到过这样的代码:番石榴的ComparisonChain转换为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);
似乎合理,因为它会返回匹配的结果对象比较链。
但我不明白的是,这两种方法似乎对我的天真眼睛做同样的事情:返回如果x
或y
属性匹配。唯一的区别是第一个检查首先检查x
属性,即检查顺序是不同的。
此外,如果这是真的,那么Arrays.binarySearch
方法将返回ypoints
元素与x
相等的属性。我不觉得这是这个功能的目的。
所以,我的JavaScript的翻译是:
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;
}
但是这两种可以简化为return (p1.y === p2.y || p1.x === p2.x) ? p1 : undefined;
。
我觉得我当然误解ComparisonChain
是如何工作的。链条的顺序是重要的吗?指导如何将其转换为JavaScript的奖励点。
(1,2) '到'(2,1)'。 'compareXCoord'将会说'(1,2)<(2,1)','compareYCoord'会说'(1,2)>(2,1)'。 –