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
@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 )