使用集合的排序方法对JList进行排序

时间:2011-11-22 13:04:51

标签: java swing sorting collections jlist

我想使用Collections的方法排序在IRC channellist中对用户列表进行排序,该列表存储为JList。以下代码在某种程度上实现了这一点:

users是包含用户的JList。

userList是中间数据结构(LinkedList),用于使用Collections对列表进行排序。

// 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++));

问题在于IRC channelList有三个用户组:OP,有声用户和普通用户,需要按层次结构组织。当然,排序方法不考虑这一点。此外,sort方法区分小写和大写字母,这是不需要的。

总结的问题:

如何处理对不同用户组的排序;我可以用Collections的排序方法以某种方式指定它,以便它符合层次结构吗?

如何阻止排序方法区分小写字母和大写字母?

我建议的解决方案:

  • (效率低!)创建三个列表,并将相应的用户组添加到它们中,排序,然后按顺序将它们添加到列表中。
  • 将用户名转换为小写(不幸)。

有什么建议吗?感谢。

1 个答案:

答案 0 :(得分:5)

  • 实现可以处理分层排序的比较器
  • 使用Collat​​or.getInstance进行区域设置感知字符串排序

以下是自定义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);
    }

}

Collat​​or使用区分大小写的排序作为给定/当前语言环境的适当选项,可以(如f.i.德语)或不可忽略(如f.i.US,如果我没记错的话)情况。如果要始终忽略,只需将compareString更改为使用o1.compareToIgnoreCase(o2)

仅供参考,SwingX项目的JXList支持默认排序(与JTable相同的机制),不需要杂技,只需提供比较器使用

 JXList list = new JXList(userListModel);
 list.setComparator(new UserComparator());
 list.setAutoCreateRowSorter(true);
 list.setSortOrder(SortOrder.ASCENDING);