集合未按预期顺序排序,例如±±在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()
中提取语言环境。
有一个非常相似的问题,前段时间问过:
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()
中提取语言环境。