繁体   English   中英

在 Java 中按字符串属性对对象的递归列表进行排序

[英]Sorting a recursive list of objects by string property in Java

我有一个深度未知的递归对象列表,我正在尝试按string属性name对列表中的所有对象进行排序。

exampleData.json

[
    {
        "name": "B",
        "items": [
            {
                "name": "Bb",
                "items": []
            },
            {
                "name": "Bc",
                "items": []
            },
            {
                "name": "Ba",
                "items": []
            }
        ]
    },
    {
        "name": "A",
        "items": [
            {
                "name": "Ab",
                "items": []
            },
            {
                "name": "Aa",
                "items": []
            }
        ]
    }
]

sortedData.json

[
    {
        "name": "A",
        "items": [
            {
                "name": "Aa",
                "items": []
            },
            {
                "name": "Ab",
                "items": []
            },
            {
                "name": "Ac",
                "items": []
            }
        ]
    },
    {
        "name": "B",
        "items": [
            {
                "name": "Ba",
                "items": []
            },
            {
                "name": "Bb",
                "items": []
            }
        ]
    }
]

下面是我目前在 Java 中的方法。虽然它似乎适用于少量数据,但我不确定它的专业性,因为我没有递归及其性能方面的经验。

    private void sortRecursivelyByName(List<Item> items) {
        if(items== null || items.isEmpty()) {
            return;
        }
        items.sort((a,b) -> {
            this.sortRecursivelyByName(a.items);
            this.sortRecursivelyByName(b.items);
            return a.getName().compareTo(b.getName());
        });
    }

您当然可以通过不在Comparator实现中进行递归调用来提高性能。 当列表自行排序时,它很可能会针对同一项目多次查询此Comparator ,因此所有嵌套列表都将被多次排序。

相反,手动传播递归。

private void sortRecursivelyByName(List<Item> items) {
    if (items == null || items.isEmpty()) {
        return;
    }
    for (Item item : items) {
        sortRecursivelyByName(item.items);
    }
    items.sort(Comparator.comparing(Item::getName));
}

递归方法的性能影响(如果有的话)取决于递归深度并且应该可以忽略不计,除非你有数千次。 方便的是,您的递归深度等于您的输入深度,因此您可能能够判断出这种情况发生的可能性。

即便如此,如果列表足够大,排序将花费大部分时间,并且在迭代方法中不会改变。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM