代码之家  ›  专栏  ›  技术社区  ›  Feedforward

按对象的边框将集合排序为链

  •  1
  • Feedforward  · 技术社区  · 7 年前

    比方说,我们有一个接力赛。每个队员都有自己的路线,把棍子传给下一个队员。 我有一个类,描述了赛道号(每个队都有自己的赛道号)和两个名字。第一个名字是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]}]
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   kfx    7 年前

    3) 这种算法问题有名字吗?

    topological sorting .

    1) 有没有可能为标准java排序方法编写一个正确的比较器?

    不。如果你有两个以上的元素,就会有一些元素不能直接比较。在您的示例中: StickTransfer(1, "Alex", "John") StickTransfer(1, "Smith", "Adam") -哪个在前面?不看其他元素是不可能知道的。

    Sample Directed Graph and Topological Sort Code

    基本上,您可以使用深度优先搜索对图形进行拓扑排序。