集合未按预期顺序排序,例如±±在zzz之后

Collection not sorted in expected order, e.g. ąąą is coming after zzz

有一个非常相似的问题,前段时间问过:

similar question

我有的是:

如我们所见,排序错误。

Bean 文件:

init(){
        root = new DefaultTreeNode("Root", null);
        createFolderTree(folderManager.getSiteFolderId(),root);
        Collections.sort(root, new TreeNodeComparator());
    }

public void createFolderTree(String id, TreeNode root) {
        List<CmisObject> childrenList = new ArrayList<>();
        ItemIterable<CmisObject> children = folderManager.getFolderChildren(id);
        Iterator<CmisObject> iterator = children.iterator();

        while (iterator.hasNext()) {
            childrenList.add(iterator.next());
        }
        Collections.sort(childrenList, new TreeNodeComparator(SortOrder.ASCENDING));

          if (children.getPageNumItems() > 0) {
            for (CmisObject o : childrenList) {
                if (o.getBaseTypeId().toString() != "CMIS_DOCUMENT") {
                    TreeNode newNode = new DefaultTreeNode(o, root);
                    createFolderTree(o.getId(), newNode);
                }
            }
        }
    }

比较器

public class TreeNodeComparator implements Comparator<CmisObject> {

private SortOrder sortOrder;

private static final long serialVersionUID = 1L;

public TreeNodeComparator(SortOrder sortOrder) {
    this.sortOrder = sortOrder;
}

@Override
public int compare(CmisObject n1, CmisObject n2) {
    try {

         Object value1 = n1.getName();
         Object value2 = n2.getName();

        String simple = "< a< ą< b < c < č < d < e < ę < i < į < y< j < k < l < s < š< t< u < ų< v < z < ž ";
        RuleBasedCollator lt_LTCollator = new RuleBasedCollator(simple);
        Collator lithuanianCollator = Collator.getInstance(new Locale("lt_LT"));
        lt_LTCollator.setStrength(Collator.PRIMARY);
        int value = lt_LTCollator.compare(value1.toString(), value2.toString());

        return SortOrder.ASCENDING.equals(sortOrder) ? value : -1 * value;

    } catch (Exception e) {
        throw new RuntimeException();
    }
}


public SortOrder getSortOrder() {
    return sortOrder;
}


public void setSortOrder(SortOrder sortOrder) {
    this.sortOrder = sortOrder;
}

}

我也尝试用与之前发布的 link 相同的方式进行操作,但我发现我的排序不适用于此..

也许我错过了一些非常简单的事情,但这开始让我烦恼。 任何帮助都会很好,

并且..我知道 root 不是列表 :)

但是..有没有办法像这样进行排序。

编辑:

所以我稍微更新了我的代码,比较器正常工作,我在

上测试了它
List<String> aa = Arrays.asList("ž", "a", "aa", "c", "ąąą", "ęęę", "ąą", "vv", "žžž", "zz", "ėėė");

输出为:

[a, aa, ąą, ąąą, c, ėėė, ęęę, vv, zz, ž, žžž]

提前致谢。

这不是 JSF 特有的问题。 JSF 只是这里的模型视图呈现器。当以不同的方式将已经准备好的模型呈现给视图时,您会遇到完全相同的问题,例如 System.out.println().

我来演示一下:

List<String> strings = Arrays.asList("zzz", "ąąą", "žžž", "ššš", "aaa", "sss");
Collections.sort(strings);
System.out.println(strings);

[aaa, sss, zzz, ąąą, ššš, žžž]

这个排序是按照英文规则排序的。这是在不使用 language-specific collation using the java.text.Collator API.

进行排序时的默认行为

在下面的示例中,我假设您对波兰语排序规则感兴趣。

List<String> strings = Arrays.asList("zzz", "ąąą", "žžž", "ššš", "aaa", "sss");
Collections.sort(strings, Collator.getInstance(new Locale("pl")));
System.out.println(strings);

[aaa, ąąą, sss, ššš, zzz, žžž]

您需要更改 TreeNodeComparator 以考虑到这一点。当您在 JSF 上下文中时,请考虑从 UIViewRoot#getLocale() 中提取语言环境。