【发布时间】:2012-06-08 09:56:44
【问题描述】:
对不起,我没有找到更好的标题:-)
我有一个树形结构,这是我的“节点”类:
public class Categoria implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotNull
private String name;
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
@JoinColumn(name = "parent_id")
private List<Categoria> children = new LinkedList<Categoria>();
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(
name = "parent_id",
insertable=false,
updatable=false
)
private Categoria parent;
@Transient
private Integer depth;
private Integer orderNumber;
... getters, setters, ....
}
不要在意Hibernate/JPA注解,它们没有问题,只要想一个理想的pojo世界就行了。
我做了一个递归方法,它构建了一个“普通”的相邻节点列表。所以,想象一下这棵树:
grandfather
|_ father
|_ son1
|_ son2
|_ uncle
grandmother
|_ mother
我们将得到一个像这样的结果列表(数字是“深度”): - 祖父 (1) - 父亲 (2) -儿子1(3) -儿子2(3) - 叔叔 (2) - 祖母 (1) - 母亲 (2)
一切都很好。
现在我想让我的用户编辑节点排序(在相同深度节点之间),我的意思是:如果我想在上面列表中的“son1”之前使用“son2”怎么办?
所以我要添加一个“orderNumber”属性:所有 orderNumbers 最初都是 0。 然后我的用户将son1的orderNumber设置为99,将son2的orderNumber设置为88。
问题是:如何重新排列结果列表以根据 orderNumber 进行排序?
但是等等....我只想对“子列表”进行排序,所以儿子排序绝对与“父亲”和“叔叔”排序无关!
感谢您帮助我们。
编辑:你们都缺少一件事。我没有很好地解释自己。这是一个例子:
- 祖父(深度:1,订单号:1)
- 父亲(深度:2,订单号:1)
- son1(深度:3,订单号:1)
- son2(深度:3,订单号:2)
- 叔叔(深度:2,订单号:2)
- 祖母(深度:1,订单号:2)
- 母亲(深度:2,订单号:1)
现在我想交换 son1 和 son2,所以结果列表将是:
- 祖父(深度:1,订单号:1)
- 父亲(深度:2,订单号:1)
- son2(深度:3,订单号:1)
- son1(深度:3,订单号:2)
- 叔叔(深度:2,订单号:2)
- 祖母(深度:1,订单号:2)
- 母亲(深度:2,订单号:1)
我怎样才能为此目的实现 sort / compareTo??
【问题讨论】:
-
父亲是祖父的儿子?还是您基于某个人?
-
我有一个不可见的“ROOT”元素,我没有把它放在生成的普通列表中。父亲是祖父的儿子。祖父是祖母的兄弟。
-
记住:orderNumber 不是“全局”的,我的意思是,三个儿子可以有 1,2,3 作为 orderNumber,两个父亲可以有 1,2.... 我如何在子列表之间进行比较?
标签: java algorithm sorting tree