Java 整理亲子关系

Java 整理亲子关系,java,sorting,tree,Java,Sorting,Tree,我在为我的类页面找出一个简单的比较方法时遇到一些问题: 页面通过getParent()-nullable引用父页面 页面有一个变量order,它只确定同一层次结构级别中的顺序 我喜欢按以下方式分类: 家长 第1小节 子领域A2 父母B 家长 子领域C1 子领域C2 我的compareTo需要如何解决这个问题?我尝试了以下方法,目前只对同一级别进行了正确排序 我的做法: @Override public int compareTo(@NonNull Object o) { int co

我在为我的类页面找出一个简单的比较方法时遇到一些问题:

  • 页面通过getParent()-nullable引用父页面
  • 页面有一个变量
    order
    ,它只确定同一层次结构级别中的顺序
我喜欢按以下方式分类:

  • 家长
  • 第1小节
  • 子领域A2
  • 父母B
  • 家长
  • 子领域C1
  • 子领域C2
  • 我的compareTo需要如何解决这个问题?我尝试了以下方法,目前只对同一级别进行了正确排序

    我的做法:

    @Override
    public int compareTo(@NonNull Object o) {
        int compare = 0;
        if (o instanceof Page) {
            Page other = (Page) o;
            if (other.parent != null) {
                compare = this.compareTo(other.parent);
            } else if (parent != null) {
                compare = this.parent.compareTo(other);
            }
            if (compare == 0) {
                compare = Integers.compareTo(this.order, other.order);
            }
        }
        return compare;
    }
    
    编辑:我的页面类:

    class Page{
        int order;
        Page parent;
    }
    

    您可能有一种检测页面深度的方法

    解决办法是:

    public class Page {
        private int order;
        private Page parent;
    
        public Page() {
        }
    
        public Page(int order, Page parent) {
            this.order = order;
            this.parent = parent;
        }
    
        public int getOrder() {
            return order;
        }
    
        public void setOrder(int order) {
            this.order = order;
        }
    
        public Page getParent() {
            return parent;
        }
    
        public void setParent(Page parent) {
            this.parent = parent;
        }
    
    
        public int compareTo(Object o){
            int compare = 0;
            if (o instanceof Page) {
                Page other = (Page) o;
                if(this.depth() == other.depth()){
                    if(Objects.equals(this.getParent(), other.getParent())){
                        return Integer.compare( other.getOrder(),this.getOrder());
                    }
                    else{
                        return this.getParent().compareTo(other.getParent());
                    }
                }
                else{
                    return Integer.compare(other.depth() , this.depth());
                }
            }
            return compare;
        }
    
        public int depth(){
            if(this.parent == null)return 0;
            else return 1+this.parent.depth();
        }
    
        public static void main(String[] args){
            Page a = new Page(1, null);
            Page a_1 = new Page(1, a);
            Page a_2 = new Page(2, a);
            Page a_1_1 = new Page(1, a_1);
            Page a_1_2 = new Page(2, a_1);
            Page a_2_1 = new Page(1, a_2);
            Page a_2_2 = new Page(2, a_2);
    
            System.out.println(a_1.compareTo(a_1_1));
            //1 because a_1 has higher depth
            System.out.println(a_1.compareTo(a_2));
            //1 because a_1 has smaller order
            System.out.println(a_1_2.compareTo(a_1_1));
            //-1 because a_1_2 has higher order
            System.out.println(a_2_1.compareTo(a_1_1));
            //-1 because a_2_1 parent is a_2 and a_1_1 parent is a_1
        }
    }
    

    您可以简单地依赖
    顺序
    链,而不是进行复杂的计算。我使用了
    字符串
    来存储每个“节点”的链:

    下面是另一棵树的示例(括号中的键)


    您从不将
    此.parent
    其他.parent
    进行比较。您可以添加级别属性(存储为属性或动态计算)以便于比较。我不是在其中一个没有父级时立即添加吗?我递归地调用compareTo,直到达到最高级。不知何故,我试图在compareTo中解决它,甚至没有考虑使用助手方法:/cheers!这不取决于我的父页面的命名方式吗?有一个按字母顺序排序的列表只是一个例子。一个名为“c”的页面可能会有名为“a”或“a”的子页面,而不依赖于字母顺序。查看我的详细信息编辑。您可以自己尝试这个示例来检查代码行为。。。
    class Page implements Comparable<Page> {
        String name;
        int order;
        Page parent;
        String key;
    
        Page() {
            name = "root";
            order  = 0;
            parent = null;
            key    = "";
        }
    
        Page(String name, int order, Page parent) {
            this.name   = name;
            this.order  = order;
            this.parent = parent;
            key = parent.key + (char)order;
        }
    
        @Override
        public int compareTo(Page o) {
            return key.compareTo(o.key);
        }
    
        @Override
        public String toString() {
            return name;
        }
    }
    
    public static void main(String[] args) {
        Page root = new Page();
    
        Page b    = new Page("b"  , 2, root);
        Page b1   = new Page("b.1", 1, b);
        Page b3   = new Page("b.3", 3, b);
        Page b2   = new Page("b.2", 2, b);
    
        Page a    = new Page("a"  , 1, root);
        Page a2   = new Page("a.2", 2, a);
        Page a1   = new Page("a.1", 1, a);
    
        List<Page> pages = Arrays.asList(root, a, a1, a2, b, b1, b2, b3);
        System.out.println(pages);
    
        Collections.shuffle(pages);
        System.out.println(pages);
    
        Collections.sort(pages);
        System.out.println(pages);
    }
    
    ┌──────┬────────┬───────┬────────────┬─────┐
    │ Page │ Parent │ Order │ Parent Key │ Key │
    ├──────┼────────┼───────┼────────────┼─────┤
    │ root │ -      │ -     │ -          │     │
    │ a    │ root   │ 1     │            │ 1   │
    │ a.1  │ a      │ 1     │ 1          │ 1 1 │
    │ a.2  │ a      │ 2     │ 1          │ 1 2 │
    │ b    │ root   │ 2     │            │ 2   │
    │ b.1  │ b      │ 1     │ 2          │ 2 1 │
    │ b.2  │ b      │ 2     │ 2          │ 2 2 │
    │ b.3  │ b      │ 3     │ 2          │ 2 3 │
    └──────┴────────┴───────┴────────────┴─────┘
    
    root      (     )
    ├ z       (1    )
    │ ├ a     (1 1  )
    │ │ └ y   (1 1 1)
    │ └ b     (1 2  )
    │   └ x   (1 2 1)
    └ c       (2    )
      ├ w     (2 1  )
      └ d     (2 2  )