Guava的ComparisonChain转换为JavaScript

时间:2017-04-07 17:54:35

标签: javascript java comparisonchain

我正在将一些代码从Java转换为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 个答案:

答案 0 :(得分:1)

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