【发布时间】:2019-02-21 20:49:22
【问题描述】:
我已阅读与此相关的所有其他答案,在我看来代码应该可以工作,唉,事实并非如此。
protected static class SpecialComparator implements Comparator<SpecialDTO>
{
@Override
public int compare( SpecialDTO sp1, SpecialDTO sp2 )
{
if( !sp1.isTypeA() || !sp2.isTypeA() )
return sp1.isTypeA().compareTo( sp2.isTypeA() );
SpecialNestedADTO spn1 = sp1.getNestedA();
SpecialNestedADTO spn2 = sp2.getNestedA();
return Comparator
.comparing( SpecialNestedADTO::getId )
.thenComparing( SpecialNestedADTO::getReps )
.compare( spn1, spn2 );
}
}
知道为什么这会引发 IllegalArgumentException 吗?
值得一提的是,如果它们的 SpecialDTO 不是 TypeA,那么我们就不能 getNestedA() 所以应该跳过比较器的其余部分。这就是为什么我们在开头有 if 语句。
【问题讨论】:
-
您的
if看起来对传递性很怀疑。考虑两个sp是A和一个不是。 -
你能说明你是如何使用这个的吗?
-
@mehdimaick 这是使用 Collections.sort(specials, new SpecialComparator()); 调用的
-
@chrylis 我已经添加了一个具有这种确切场景的测试,但是如果 A-B>0 和 B-C>0 然后 A-C>0 ...我无法创建导致它失败的测试。任何想法如何与您的建议?
-
@StuartMarks 没错,在这种特殊情况下,我们优先考虑 TypeA 对象。
标签: java comparator