Jsf 素数面中的树节点排序
我正在使用JSF2.1和PrimeFaces3.3。我正在使用primefaces树组件从数据库中装入树。我想在所有级别按字母顺序对树节点进行排序。请在这方面帮助我。您必须使用Jsf 素数面中的树节点排序,jsf,jsf-2,primefaces,Jsf,Jsf 2,Primefaces,我正在使用JSF2.1和PrimeFaces3.3。我正在使用primefaces树组件从数据库中装入树。我想在所有级别按字母顺序对树节点进行排序。请在这方面帮助我。您必须使用集合对ManagedBean中的PrimefacesDefaultTreeNode对象进行排序。排序和比较类 public TreeNodeComparator() implements Comparator<TreeNode> { public int compare(TreeNode n1, TreeN
集合对ManagedBean中的PrimefacesDefaultTreeNode
对象进行排序。排序
和比较类
public TreeNodeComparator() implements Comparator<TreeNode> {
public int compare(TreeNode n1, TreeNode n2) {
// This assumes the tree node data is a string
return n1.getData().compareTo(n2.getData());
}
}
之所以将所有内容都设置为null,是因为在DefaultTreeNode上设置父对象时,它会添加到父对象-子对象列表中。设置节点父节点的顺序决定了它们在树组件中的显示顺序
知道我们可以使用比较器对每个列表进行单独排序
Collections.sort(rootNodeChildren, new TreeNodeComparator());
Collections.sort(node1Children, new TreeNodeComparator());
Collections.sort(node2Children, new TreeNodeComparator());
现在所有的列表都被排序了,这样我们就可以一次循环一个合适的父列表。您可能可以编写一个算法来确定这一点,也可以保留一个单独的数据结构来构建树层次结构,而无需添加到列表中
另一种方法是重写DefaultTreeNode类并为其提供一个排序方法,总体来说可能更简单:
public SortableDefaultTreeNode extends DefaultTreeNode {
public void sort() {
TreeNodeComparator comparator = new TreeNodeComparator();
Collections.sort(this.children, comparator);
for (TreeNode child : children) {
child.sort();
}
}
}
现在,您只需构建树节点,然后调用
root.sort()
,它将按字母顺序递归地对每个级别的所有子节点进行排序。您还可以使用通用的可比较树节点方法,例如:
Base取自primefacesDefaultTreeNode
,未修改的更改在下面的代码中被忽略
如果孩子的不应该被限制在T上,我们可以使用
treenodecomplable我们在通过比较器进行排序时遇到了问题,我们发现,已经提供了一个方便的PrimeFaces类,它像一个符咒一样工作:)谢谢枫树。它节省了我的时间。请检查您的答案,因为类java.util.Collections
有两个版本的sort
方法。这两种方法都需要一个java.util.List
类型的参数,它与TreeNode
类型不兼容。这是最好的解决方案,也很简单。
public SortableDefaultTreeNode extends DefaultTreeNode {
public void sort() {
TreeNodeComparator comparator = new TreeNodeComparator();
Collections.sort(this.children, comparator);
for (TreeNode child : children) {
child.sort();
}
}
}
public class TreeNodeComparable<T extends Comparable<T>> implements TreeNode, Serializable,
Comparable<TreeNodeComparable<T>>
{
private static final long serialVersionUID = ...;
private T data;
private List<TreeNodeComparable<T>> children;
public TreeNodeComparable(final String type, final T data, final TreeNodeComparable<T> parent)
{
this.type = type;
this.data = data;
this.children = (List) new TreeNodeChildren(this);
if (parent != null)
parent.getChildren().add(this);
}
/**
* Comparison only depends on the underlying data
*
* @see ObjectUtils#compare(Comparable, Comparable)
*/
@Override
public int compareTo(final TreeNodeComparable<T> node)
{
if (node == null)
throw new NullPointerException("node");
return ObjectUtils.compare((T) this.getData(), (T) node.getData());
}
/**
* Recursively sorts the complete tree.
*/
public void sort()
{
Collections.sort(this.children);
for (final TreeNodeComparable<T> child : this.children)
{
child.sort();
// must reset parent due to PF problems
// http://forum.primefaces.org/posting.php?mode=reply&f=3&t=39752
child.setParent(this);
}
}
@SuppressWarnings("unchecked")
@Override
public boolean equals(final Object obj)
{
if (this == obj)
return true;
if (obj == null || this.getClass() != obj.getClass())
return false;
final TreeNodeComparable<T> other = (TreeNodeComparable<T>) obj;
return ObjectUtils.equals(this.data, other.data);
}
@Override
public int hashCode()
{
return new HashCodeBuilder().append(this.data).toHashCode();
}
public void setData(final Object data)
{
if (data != null && !(data instanceof Comparable))
throw new IllegalArgumentException();
this.data = (T) data;
}
@SuppressWarnings(
{
"unchecked", "rawtypes"
})
public List<TreeNode> getChildren()
{
return (List) this.children;
}
}