如何用ComparisonChain验证?

时间:2015-02-12 10:41:48

标签: java guava

我使用com.google.common.collect.ComparatorChain为不同的对象实现自定义比较器。

现在,以下测试失败,但为什么?

@Test
public void chainTest() {
    ComparisonChain comparator = ComparisonChain.start()
            .compare("a", "a");
    assertTrue(comparator.result() == 0);
    comparator.compare("a", "b");
    assertTrue(comparator.result() != 0); //fails with AssertionError
}

Afaik第二个结果应该!= 0a != b

我当然可以重新分配比较器,如: comparator = comparator.compare("a", "b");

但是这会丢弃在重新分配之前获得的任何结果。

2 个答案:

答案 0 :(得分:4)

您忽略了comparator.compare("a", "b")的返回值。调用compare()并不会改变现有比较的状态 - 它会返回与正确状态的比较(可能相同也可能不相同 - 只要比较结果为0,状态将是"活跃")。

更改您要使用的代码:

comparator = comparator.compare("a", "b");

它应该有用。

这个想法是你只是继续将比较传递给链,并且只要它知道整体结果(即当其中一个非零时)它就会忽略它们。例如:

import com.google.common.collect.ComparisonChain;

public class Test {   
    public static void main(String[] args) {
        int result = ComparisonChain.start()
            .compare("a", "b") // Chain terminates here
            .compare("a", "a") // Irrelevant
            .result();
        System.out.println(result); // < 0 (e.g. -1)
    }
}

答案 1 :(得分:1)

修改

如果你真的想要它,你可以创建一个“分支”:

    ComparisonChain comparator = ComparisonChain.start()
            .compare("a", "a");
    ComparisonChain branch = comparator.compare("a", "b");
    assertTrue(comparator.result() == 0);
    assertTrue(branch.result() != 0);

i.e

-->compare("a", "a")--->result
                    \
                     -->compare("a", "b")--> result