繁体   English   中英

在Primefaces中对树节点进行排序

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM