Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 素数面中的树节点排序_Jsf_Jsf 2_Primefaces - Fatal编程技术网

Jsf 素数面中的树节点排序

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

我正在使用JSF2.1和PrimeFaces3.3。我正在使用primefaces树组件从数据库中装入树。我想在所有级别按字母顺序对树节点进行排序。请在这方面帮助我。

您必须使用
集合对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());
  }
}
之所以将所有内容都设置为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取自primefaces
DefaultTreeNode
,未修改的更改在下面的代码中被忽略


如果孩子的不应该被限制在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;
    }
}