Java排序对象列表,按字母顺序排列

时间:2018-11-13 10:44:48

标签: java sorting recursion hierarchy comparator

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

每个Item具有以下方法:

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

层次结构中的每个级别都是建筑工地中的一个级别,例如,级别1是房屋1,级别2是楼层1,级别3是房间,级别4是窗口。

我有一个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 个答案:

答案 0 :(得分:0)

这确实是递归的。问题在于,仅当两个节点处于同一级别时,才能进行简单的递归比较。

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

这只是为了给您一个想法。未经测试或编译。

答案 1 :(得分:-1)

伪代码:尝试这样

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

        List<Object > childElements = childNode .....;
        if(childElements.size() > 0) {
            printChildElements( childElements);
        }
    }