比方说,我们有一个接力赛。每个队员都有自己的路线,把棍子传给下一个队员。
我有一个类,描述了赛道号(每个队都有自己的赛道号)和两个名字。第一个名字是stick's owner,代表音轨N的一部分,第二个名字是stick's owner,代表音轨的下一部分(N+1)。
class StickTransfer {
int trackId;
String stickFrom;
String stickTo;
}
我的任务是将所有StickTransfer的对象按1)tracked 2)stick的行程顺序进行排序。
例如,假设有一支队伍在赛道1上,他们是亚历克斯->约翰->史密斯->亚当。
list.add(new StickTransfer(1, "John", "Smith");
list.add(new StickTransfer(1, "Alex", "John");
list.add(new StickTransfer(1, "Smith", "Adam");
order(list)
// After that I want to get:
// Alex - John - first entry
// John - Smith - second entry
// Smith - Adam - third entry
Comparator.comparing(StickTransfer::getTrackId)
.thenComparing((o1, o2) -> {
if (o1.getStickFrom().equals(o2.getStickTo())) {
return 1;
}
if (o1.getStickTo().equals(o2.getStickFrom())) {
return -1;
}
return 0;
});
但我有一个问题,使用这个比较器,有些条目仍然没有排序。我认为这是因为它不是一个很好的比较。
现在我有一些问题:
2) 如果没有,有没有办法用一些Java标准方法来解决这个问题?
3) 这种算法问题有名字吗?
正确顺序:X->Y->A->B->C->D->E
StickTransfer stickTransferArr[] = {
new StickTransfer(1, "A", "B"),
new StickTransfer(1, "C", "D"),
new StickTransfer(1, "B", "C"),
new StickTransfer(1, "X", "Y"),
new StickTransfer(1, "Y", "A"),
new StickTransfer(1, "D", "E")
};
Arrays.sort(stickTransferArr, cmp);
结果:
[{track=1, [A - > B]}, {track=1, [B - > C]}, {track=1, [C - > D]}, {track=1, [X - > Y]}, {track=1, [Y - > A]}, {track=1, [D - > E]}]