为了账号安全,请及时绑定邮箱和手机立即绑定

Java sort 按字母顺序排列的具有层次结构的对象列表

Java sort 按字母顺序排列的具有层次结构的对象列表

牛魔王的故事 2022-01-19 09:27:41
我有一个名为Item. Item可以有父母和孩子。每个Item都有以下方法:getParent() --> 返回一个 ItemgetChildren() --> 返回一个 List<Item>isLeaf() --> 返回一个 BooleangetName() --> 返回一个 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% 清楚,我将不胜感激任何帮助和抱歉,但很难描述。谢谢。
查看完整描述

2 回答

?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

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


// 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);

}

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


查看完整回答
反对 回复 2022-01-19
?
HUWWW

TA贡献1874条经验 获得超12个赞

伪代码:试试这样


    private static void printChildElements(List<Object> childNodes) {

    for(Object childNode : childNodes) {


        List<Object > childElements = childNode .....;

        if(childElements.size() > 0) {

            printChildElements( childElements);

        }

    }


查看完整回答
反对 回复 2022-01-19
  • 2 回答
  • 0 关注
  • 226 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号