Оптимизированный способ сортировки JList в 2 группах - PullRequest
0 голосов
/ 25 мая 2011

У меня есть список пользователей.В котором один пользователь имеет присутствие 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;
                }
            }
        } 
    }

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

Ответы [ 2 ]

1 голос
/ 25 мая 2011

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

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

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

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

  1. Зацикливается один раз на всех пользователях, выбрасывая всех «первых» пользователей в ArrayList A, всех «вторых» пользователей в ArrayList B
  2. Сортировка A, Сортировка B,
  3. Объедините А и В. вместе.
0 голосов
/ 25 мая 2011

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

...