[英]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.