递归通用数据结构中的java对象排序
我有一个通用树类,其中每个树节点都保存一些数据。每段数据都有一个字符串类型的属性。我想根据这个属性按字母顺序对每个树节点的子节点进行排序
树类:
public class Tree<T>{
public T data;
public List<Tree<T>> children = new ArrayList<Tree<T>>();
}
请注意,树的子对象是tree类型
树类的实际类型参数示例如下:
public class DataItem{
public String name;
}
我的想法是用sort()方法扩展Tree类,并使用一个比较器,如下所示,但我仍停留在比较函数上:
public class Tree<T>{
public T data;
public List<Tree<T>> children = new ArrayList<Tree<T>>();
public void sort(){
Collections.sort(this.children,
new Comparator<Tree<T>>(){
@Override
public int compare(Tree<T> objectA, Tree<T> objectB){
//I am stuck here!
return 0;
}
}
);
for(Tree<T> child: this.children){
child.sort();
}
}
}
我有不同的想法来解决这个问题:
- 使用反射来访问对象的属性并进行比较李>
- 在DataItem中实现可比较的接口李>
使用新界面访问对象的属性以进行比较:
public interface GetComparisonAttribute { public String getComparisonAttribute(); } public class DataItem implements GetComparisonAttribute{ public String name; @Override public String GetComparisonAttribute(){ return this.name; } } //the comparison function inside Tree<T>.sort(): public int compare(Tree<T> objectA, Tree<T> objectB){ return objectA.data.getComparisonAttribute() .compareToIgnoreCase(objectB.data.getComparisonAttribute()); }
正确或最好的做法是什么?还有别的办法吗
能够指定排序属性可能很重要
我认为使用收藏会很好。sort()直接在树上执行,但在这种递归数据结构中实现它确实让我感到困惑。这样做的一个缺点是我无法指定排序属性
# 1 楼答案
试试这个:
创建类树时,应该传递类型T。然后你可以向下转换到
DataItem
并根据你喜欢的文件对列表进行排序。当然,除了DataItem
之外,您还可以对照其他类型参数进行检查