Сортировка JList с использованием метода сортировки коллекций - PullRequest
3 голосов
/ 22 ноября 2011

Я хотел бы отсортировать свой список пользователей в канале IRC, который хранится в виде JList, с использованием метода сортировки Collections. Код ниже выполняет это, в некоторой степени:

users - это JList, содержащий пользователей.

userList - это промежуточная структура данных (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, голосовые пользователи и обычные пользователи, и они должны быть организованы в иерархию. Конечно, метод сортировки не принимает это во внимание. Кроме того, метод сортировки различает строчные и заглавные буквы, и это нежелательно.

Всего вопросов:

Как обрабатывать сортировку по группам пользователей; Могу ли я указать его с помощью метода сортировки Коллекций, чтобы он соответствовал иерархии?

Как помешать методу сортировки различать строчные и заглавные буквы?

Мои предлагаемые решения:

  • (Неэффективно!) Создайте три списка и добавьте в них соответствующие группы пользователей, отсортируйте, а затем добавьте их в список в удобном порядке.
  • преобразовать имена пользователей в строчные (неудачно).

Есть предложения? Спасибо.

1 Ответ

5 голосов
/ 22 ноября 2011
  • реализует Компаратор, который может обрабатывать иерархическую сортировку
  • используйте Collator.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);
    }

}

Collator использует регистрозависимую сортировку в зависимости от конкретной / текущей локали, которая может (как например, немецкий) или не игнорировать (как, например, США, если я правильно помню) регистр. Если вы хотите всегда игнорировать, просто измените CompareString, чтобы использовать o1.compareToIgnoreCase (o2)

FYI, JXList проекта SwingX поддерживает сортировку по умолчанию (тот же механизм, что и в JTable), акробатика не требуется, просто предоставьте компаратор для использования

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