【问题标题】:Java sort List of objects with a hierarchy alphabeticallyJava sort 按字母顺序排列的具有层次结构的对象列表
【发布时间】:2019-04-16 04:23:23
【问题描述】:

我有一个名为Item 的实体。 Item可以有父母和孩子。

每个Item都有以下方法:

  • getParent() --> 返回Item
  • getChildren() --> 返回List<Item>
  • isLeaf() --> 返回Boolean
  • getName() --> 返回String

层次结构中的每一层都是建筑工地的一个层,例如,1 层是 House 1,2 层是 Floor 1,3 层是 Room,4 层是 Window。

我有一个List<Item,我需要像这样对它们进行排序:

  • 项目 1(房屋 1 > 楼层 1 > 房间 1 > 浴室)
  • 项目 2(房屋 1 > 楼层 1 > 房间 2 > 地下室)
  • 项目 3(房屋 1 > 楼层 1 > 房间 2 > 门)
  • 第 4 项(房屋 1 > 楼层 1 > 房间 2 > 窗​​户)
  • 项目 5(房屋 1 > 楼层 2 > 房间 1 > 门)

我认为我需要某种递归函数,但我无法想象它必须是怎样的。

我已经研究过在 Java 中对具有层次结构的对象进行排序,但我没有找到与我的情况类似的东西。

如果问题不是 100% 明确但很难描述,我将不胜感激。

谢谢。

【问题讨论】:

  • 基本上你想对叶子进行排序呢?我想你会在将元素添加到房屋对象时进行排序,然后对叶子进行深度优先查找
  • 什么是实体?您不能创建一个名为Object 的新类。 Java 中已经有一个重要的类叫做Object ;)
  • @flakes 感谢您的评论,但我认为这并不重要,也不会为问题添加任何内容。 “对象”的真实名称是Objekt(德语中的对象)。我省略了该细节,以避免将人们与不相关的信息混淆。如果你觉得更开心,我可以将 Object 重命名为 Item
  • 您需要提供一些代码。我不清楚你的实施是什么。是item(房屋、楼层、房间)类型的所有实体还是那些不同的类?他们是否实现/扩展item 类?
  • 在讨论类设计/方法实现时,有一个类名对于交流非常重要!此外,您应该在问题中提供一些代码,以向我们展示您在什么时候卡住了。尽可能多地定义解决方案,您会发现人们更好地理解您的问题并提供更接近您期望的答案。 顺便说一句,像ObjektItem 这样的名称对于一个类来说是非常不透明的名称。尝试一些更有意义的东西(使其实际目的显而易见,HouseNodeFloorplanTree 等)。良好的命名对于清洁可维护的代码至关重要

标签: java sorting recursion hierarchy comparator


【解决方案1】:

它确实是递归的。问题在于,只有两个节点处于同一级别时,简单的递归比较才会起作用。

// Same level compare
int compareSameLevel(Item item) {
    int c = 0;
    if (this.getParent != null) {
        c = compare(this.getParent(), item.getParent());
    }
    return (c != 0) ? c : getName().compare(item.getName());
}

但您可以调整级别以找到一个共同的级别并假设孩子追随父母:

// Compare on any level
int compare(Item item) {
    Item thisItem = this;
    int thisLevel = thisItem.level();
    int itemLevel = item.level();

    for (int i = thisLevel; i > itemLevel; i--) {
        thisItem = thisItem.getParent();
    }

    for (int j = itemLevel; j > thisLevel; j--) {
        item = item.getParent();
    }

    int c = compareSameLevel(thisItem, item);

    return c != 0 ? c : (thisLevel > itemLevel ? -1 : 1);
}

这只是给你一个想法。它未经测试或编译。

【讨论】:

    【解决方案2】:

    伪代码:试试这样

        private static void printChildElements(List<Object> childNodes) {
        for(Object childNode : childNodes) {
    
            List<Object > childElements = childNode .....;
            if(childElements.size() > 0) {
                printChildElements( childElements);
            }
        }
    

    【讨论】:

    • 问题是关于排序,而不是打印整棵树。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    相关资源
    最近更新 更多