2017-04-07 24 views
0

我从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); 

似乎合理,因为它会返回匹配的结果对象比较链。

但我不明白的是,这两种方法似乎对我的天真眼睛做同样的事情:返回如果xy属性匹配。唯一的区别是第一个检查首先检查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

(1,2) '到'(2,1)'。 'compareXCoord'将会说'(1,2)<(2,1)','compareYCoord'会说'(1,2)>(2,1)'。 –

回答

1

您需要记住,Java Comparator返回值是三值(即更高,更低或相等)。因此,您比较坐标的顺序很重要 - 首先排序x首先与y排序不同。

0

一个简单的问题的位现在我从Java文档知道java.utils.Arrays.binarySearch的是:

数组必须根据指定的比较由排序被按升序排列(如(T [],比较器)方法)。

ComparisonChain的s的用作验证,以确保该阵列由X然后Y性质compareXCoords反之亦然排序为compareYCoords

因此,在JavaScript中,在阵列如Java将被Arrays.binarySearch(ypoints, Point.make(Double.NEGATIVE_INFINITY, ymin), compareYCoord);的代码有问题可以预期,分别排序为compareXCoordcompareYCoord:这些比较他们如何比较不同`

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); 
}