due*_*and 3 java sorting collections swing jlist
我想使用Collections的方法排序在IRC channellist中对用户列表进行排序,该列表存储为JList.以下代码在某种程度上实现了这一点:
users 是包含用户的JList.
userList 是用于使用Collections对列表进行排序的中间数据结构(LinkedList).
// Iterate through the JList and add the users to a LinkedList of strings.
for(Object userName : users.toArray())
userList.add(userName.toString());
// Sort
Collections.sort(userList);
// Clear the user list (removes all users).
users.clear();
// Put the sorted userList in users again.
while(iterator.hasNext() && i < userList.size())
users.addElement(userList(get(i++));
Run Code Online (Sandbox Code Playgroud)
问题是IRC channelList有三个用户组:OP,有声用户和普通用户,它们需要按层次结构组织.当然,排序方法不考虑这一点.此外,sort方法区分小写和大写字母,这是不需要的.
总结的问题:
如何处理对不同用户组的排序; 我可以用Collections的排序方法以某种方式指定它,以便它符合层次结构吗?
如何阻止排序方法区分小写和大写字母?
我建议的解决方案
有什么建议?谢谢.
这是自定义Comparator的代码段
public static class UserComparator implements Comparator<User> {
private Collator collator = Collator.getInstance();
@Override
public int compare(User o1, User o2) {
int compare = compareString(o1.getGroup(), o2.getGroup());
if (compare == 0) {
return compareString(o1.getName(), o2.getName());
}
return compare;
}
private int compareString(String o1, String o2) {
return collator.compare(o1, o2);
}
}
Run Code Online (Sandbox Code Playgroud)
Collator使用区分大小写的排序作为给定/当前区域设置的适当选择,这可能(如德语)或可能不会忽略(如美国,如果我没记错的话).如果要始终忽略,只需将compareString更改为使用o1.compareToIgnoreCase(o2)
FYI,SwingX项目的JXList支持默认排序(与JTable相同的机制),不需要杂技,只需提供比较器使用
JXList list = new JXList(userListModel);
list.setComparator(new UserComparator());
list.setAutoCreateRowSorter(true);
list.setSortOrder(SortOrder.ASCENDING);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5364 次 |
| 最近记录: |