优化的方式将JList分为两组

时间:2011-05-25 12:49:57

标签: java swing jlist defaultlistmodel

我有一个用户名单。其中一些用户有第一个存在而其他用户有第二个。所以我想要的是显示这个列表首先它按排序顺序显示存在= 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++;
    }

此处modelDefaultListModel的{​​{1}}。 sortArray方法是:

JList

如何优化上述代码?

2 个答案:

答案 0 :(得分:1)

将用户放入ArrayList并使用内置的Java排序功能:http://download.oracle.com/javase/6/docs/api/java/util/Collections.html

这将调用一个mergesort,它比你写的更有效。

你想在第一个for循环中做什么?

据我所见,您只需要执行以下操作:

  1. 在所有用户上循环一遍,将所有“1st”用户投放到ArrayList A中,将所有“第二”用户投放到ArrayList B中
  2. 排序A,排序B,
  3. 将A和B合并在一起。

答案 1 :(得分:0)

如@Jeroen所述,实施Comparable是首选方法。您还可以Comparator中所示实施{{1}}或使用RecordComparator