Оптимизированный способ отсортировать JList по 2 группам.

У меня есть список пользователей. В котором у одного пользователя есть 1-е присутствие, а у других - 2-е. ТАК, что я хочу, это отобразить этот список как сначала, он показывает пользователей с присутствием = 1 в отсортированном порядке, а затем пользователя с присутствием = 2 в отсортированном порядке. Здесь сортировка выполняется по имени пользователя. В настоящее время я могу делать все это, но это занимает много времени, так как в списке около 250 пользователей. Кроме того, присутствие пользователя может измениться в любое время. У меня есть подключение к сокету, чтобы слушать это, и в этот раз мне также нужно, прежде всего, в списке, чтобы показать обновленные пользовательские данные. Как я могу сделать это так, чтобы это занимало меньше времени и не заставляло мое приложение зависать?

Вот что я делаю в настоящее время:

    List<User> us = new ArrayList<User>();
    int num = model[j].getSize();
    String[] strArr = new String[num];
    for (int i = 0; i < num; i++) {
        strArr[i] = ((User)model[j].get(i)).getName();
        if(!isDuplicateSortedUser(strArr[i], us))
            us.add((User)model[j].get(i));
    }
    sortArray(Collator.getInstance(), strArr);
    User user;
    List<User> temp2 = new ArrayList<User>();
    List<User> temp1 = new ArrayList<User>();
    for (String string : strArr) {
        for (int i = 0; i < num; i++) {
            user = (User) us.get(i);
            if(user.getName().equals(string)){
                if(!isDuplicateSortedUser(user.getUserid(), temp2) && !temp2.contains(user) && !temp1.contains(user)){
                    if(user.getPresence().toLowerCase().equals("1st"))
                        temp2.add(user);
                    else
                        temp1.add(user);
                }
            }
        }
    }
    int l=0;
    for (User user2 : temp1) {
        model[j].setElementAt(user2, l);
        l++;
    }
    for (User user2 : temp2) {
        model[j].setElementAt(user2, l);
        l++;
    }

Здесь model — это DefaultListModel из JList. Метод sortArray:

private void sortArray(Collator collator, String[] strArray) {
        String tmp;
        if (strArray.length == 1) return;
        for (int i = 0; i < strArray.length; i++) {
            for (int j = i + 1; j < strArray.length; j++) {
                if(collator.compare(strArray[i], strArray[j] ) > 0 ) {
                    tmp = strArray[i];
                    strArray[i] = strArray[j];
                    strArray[j] = tmp;
                }
            }
        } 
    }

Как я могу оптимизировать приведенный выше код?


person Harry Joy    schedule 25.05.2011    source источник


Ответы (2)


Поместите пользователей в список ArrayList и используйте встроенную функцию сортировки Java: http://download.oracle.com/javase/6/docs/api/java/util/Collections.html

Это вызовет сортировку слиянием, которая будет более эффективной, чем то, что вы написали.

Что именно вы пытаетесь сделать в первом цикле for?

Насколько я вижу, вам нужно сделать следующее:

  1. Цикл один раз для всех пользователей, бросая всех «1-х» пользователей в ArrayList A, всех «2-х» пользователей в ArrayList B
  2. Сорт А, Сорт Б,
  3. Объедините A и B обратно вместе.
person Jeroen Baert    schedule 25.05.2011
comment
когда я использую Collections.sort(us), он показывает следующую ошибку: Bound mismatch: The generic method sort(List<T>) of type Collections is not applicable for the arguments (List<User>). The inferred type User is not a valid substitute for the bounded parameter <T extends Comparable<? super T>> - person Harry Joy; 25.05.2011
comment
Реализуйте интерфейс Comparable для ваших пользовательских объектов. - person Jeroen Baert; 25.05.2011

Как отметил @Jeroen, предпочтительным подходом является реализация Comparable. Вы также можете реализовать Comparator, как показано в RecordComparator или используйте SortedComboBoxModel.

person trashgod    schedule 25.05.2011