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

标签 java swing sorting collections jlist

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

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

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

问题总结:

如何处理不同用户组的排序;我可以用 Collections 的排序方法指定它以使其符合层次结构吗?

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

我提出的解决方案:

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

有什么建议吗?谢谢。

最佳答案

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

这是自定义比较器的代码片段

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);
    }

}

整理器根据给定/当前语言环境使用区分大小写的排序,这可能(如德语)或可能不会忽略(如美国,如果我没记错的话)大小写。如果您想始终忽略,只需将 compareString 更改为使用 o1.compareToIgnoreCase(o2)

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

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

关于java - 使用集合的排序方法对 JList 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8227285/

相关文章:

java - Tomcat 服务器正在运行但未在浏览器中加载

java - 关于 Wicket 7 中 wicket.properties 位置的冲突警告

java - 将 Arraylist 存储在 hashmap 中

python - 如何对数值字典列表进行排序?

java - 有没有可以排序的 CopyOnWriteArrayList 的替代方案?

java - 检索 ResultSet 中的条目数

java - JCheckBox不触发isselect

java - 使用 Runtime.getRuntime().exec() 从 Java Swing 应用程序启动 jEdit

java - 如何使用 JDialog、JPanel 解决图形故障?

java - 优先级队列的值改变后无法自动排序