0

ユーザーの jlist があります。一部のユーザーは 1 番目のプレゼンスを持ち、他のユーザーは 2 番目のプレゼンスを持ちます。SO 私が望むのは、このリストを次のように表示することです。まず、presence=1st のユーザーを並べ替えた順序で表示し、次に present=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;
                }
            }
        } 
    }

上記のコードを最適化するにはどうすればよいですか?

4

2 に答える 2

1

ユーザーを ArrayList に入れ、組み込みの Java ソート機能を使用します: http://download.oracle.com/javase/6/docs/api/java/util/Collections.html

これにより、マージソートが呼び出されます。これは、記述したものよりも効率的です。

最初の for ループで正確に何をしようとしていますか?

私が見る限り、次のことだけを行う必要があります。

  1. すべてのユーザーを 1 回ループし、ArrayList A のすべての「1 番目」のユーザー、ArrayList B のすべての「2 番目」のユーザーをスローします。
  2. ソートA、ソートB、
  3. A と B をマージして元に戻します。
于 2011-05-25T12:53:51.827 に答える
0

@Jeroen が指摘したように、実装Comparableが推奨されるアプローチです。Comparatorに示すように実装しRecordComparatorたり、 を使用したりすることもできますSortedComboBoxModel

于 2011-05-25T18:58:43.043 に答える