我有一个项目清单:
[foo, bar, baz, boo, abc, xyz]
其中一些项目希望按特定顺序排序:
foo after abc
xyz before baz
只要遵守所有给定的规则,其他项目的顺序无关紧要。
以下是一些可能的排序顺序:
[abc, foo, xyz, baz, bar, boo]
[abc, xyz, foo, baz, bar, boo]
[abc, foo, bar, boo, xyz, baz]
[xyz, baz, bar, boo, abc, foo]
使用 aComparator似乎不起作用,因为设计一个列表可能会导致它失败。例如,如果我们的 compare 方法如下所示:
list.sort((a, b) -> {
if (a.isAfter(b)) {
return 1;
} else if (a.isBefore(b)) {
return -1;
}
return 0;
});
我们针对 运行它[foo, bar, baz, boo, abc, xyz],该方法将执行如下操作:
Comparing 'bar' to 'foo': no rule present -> 0
Comparing 'baz' to 'bar': no rule present -> 0
Comparing 'boo' to 'baz': no rule present -> 0
Comparing 'abc' to 'boo': no rule present -> 0
Comparing 'xyz' to 'abc': no rule present -> 0
Comparator 将运行,但它只会输出与您开始时相同的列表。似乎要使 Comparator 正常工作,您需要知道列表中任意两个项目之间的关系,而不仅仅是其中一些项目。
知道这一点,一种解决方案是将所有具有规则的元素移动到一个单独的列表中,对该列表进行排序,然后将其与其余元素合并。通过这种方式,我们确实知道我们正在比较的所有项目之间的关系。但是,要使其正常工作,您必须为每个规则创建单独的列表。否则,您可能会再次遇到完全相同的问题:
[foo, bar, baz, boo, abc, xyz] // original
[foo, baz, abc, xyz] // elements with rules
[foo, baz, abc, xyz] // elements with rules **after comparator**
[foo, baz, abc, xyz, bar, boo] // merged with the rest, rules not satisfied
为每个可能出现的规则创建列表并不是很优雅。我可以使用另一种分拣机来适应我正在寻找的行为吗?
慕桂英3389331
尚方宝剑之说
相关分类