我有一个通用树类,其中每个树节点都包含一些数据。每条数据都有一个字符串类型的属性。我想按此属性按字母顺序对每个树节点的子节点进行排序。
树类:
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 类并使用如下所示的 Comparator 但我被困在比较函数中:
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 中实现接口 Comparable。
使用新接口访问对象的属性以进行比较:
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()); }
什么是正确或最好的做法?还有其他方法吗?
能够指定排序属性可能很重要。
我认为直接在 Tree 上使用 Collections.sort() 会很好,但在这种递归数据结构中实现它真的让我感到困惑。这样做的一个缺点是我无法指定排序属性。