我使用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第二个结果应该!= 0
为a != b
?
我当然可以重新分配比较器,如:
comparator = comparator.compare("a", "b");
但是这会丢弃在重新分配之前获得的任何结果。
答案 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