[英]Sorting tree nodes in Primefaces
我正在使用JSF 2.1和Primefaces 3.3。 我正在使用primefaces树组件从数据库创建树。 我想在所有级别上按字母顺序对树节点进行排序。 请帮我。
我们在通过Comparator
进行排序时遇到了问题,发现, 已经提供了一个方便的PrimeFaces TreeUtils.sortNode(TreeNode,Comparator)类,它的工作方式就像一个超级魅力:)
您将必须使用Collections.sort
和Comparator类在ManagedBean上对Primefaces DefaultTreeNode
对象进行排序。
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());
}
}
在您的托管bean中,您将需要在不添加其父母的情况下汇编您的子清单。 那可以稍后再说。 现在,构建您的孩子列出每个级别,并将parent
级设置为null
;
TreeNode node1 = new DefaultTreeNode("node1", null);
TreeNode node2 = new DefaultTreeNode("node2", null);
TreeNode child1node1 = new DefaultTreeNode("zgnagn", null);
TreeNode child2node1 = new DefaultTreeNode("vvnieeianag", null);
TreeNode child1node2 = new DefaultTreeNode("cajkgnagair", null);
TreeNode child2node2 = new DefaultTreeNode("ajaavnagwokd", null);
rootNodeChildren.add(node1);
rootNodeChildren.add(node2);
node1Children.add(child1node1);
node1Children.add(child2node1);
node2Children.add(child1node2);
node2Children.add(child2node2);
我们将所有内容都设置为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();
}
}
}
现在,您可以构建出TreeNodes,然后调用root.sort()
,它将按字母顺序对每个级别的所有子级递归排序。
您还可以使用通用的类似TreeNode方法,例如:
基础取自素面DefaultTreeNode
,未修改的更改在以下代码中被忽略。
如果不应该将孩子限制在T上,则可以使用TreeNodeComparable<T extends Comparable<?>>
并在compareTo()
方法中compareTo()
为Comparable
。
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;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.