有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

递归通用数据结构中的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) 个答案

  1. # 1 楼答案

    试试这个:

    public class Tree<T> {
        public T data;
        public List<Tree<T>> children = new ArrayList<Tree<T>>();
        private Class<T> type;
    
        public Tree(Class<T> t) {
            type = t;
        }
    
        public void sort(){
            Collections.sort(this.children,
                new Comparator<Tree<T>>(){
                    @Override
                    public int compare(Tree<T> objectA, Tree<T> objectB){
                    if (type==DataItem.class)
                       {
                        DataItem diA = (DataItem) (objectA.data);
                        DataItem diB = (DataItem) (objectB.data);
    
                        return diA.name.compareTo(diB.name);
                        }
                      else
                        throw new IllegalArgumentException();
    
                    }
                }
            );
            for(Tree<T> child: this.children){
                child.sort();
            }
        }
    
    }
    

    创建类树时,应该传递类型T。然后你可以向下转换到DataItem并根据你喜欢的文件对列表进行排序。当然,除了DataItem之外,您还可以对照其他类型参数进行检查