【问题标题】:Sorting array list method is to slow排序数组列表方法很慢
【发布时间】:2015-05-19 07:11:53
【问题描述】:

首先要说我看到非常相似的问题,但我认为这不是重复的。

我需要对字符串数组列表进行排序,其中列表成员的格式为ID::NAMEID 是某个数字,name 是某个字符串。

我使用的第一个想法很简单

ArrayList<String> my_list = new ArrayList<String>();
my_list.add("0" + "::" + "ABC");
my_list.add("2" + "::" + "DBC");
my_list.add("1" + "::" + "DDC");
my_list.add("10" + "::" + "DBD");
my_list.add("22" + "::" + "DDD");
(etc...)
Collections.sort(my_list);

问题是,在这种排序方法中,"10" + "::" + "DBD""1" + "::" + "DDC" 之前等等,我得到类似:

0::ABC, 10::DBD, 1::DDC, 22::DDD, 2::DBC

而我需要的是:

0::ABC, 1::DDC, 2::DBC, 10::DBD, 22::DDD

在此之后,我尝试创建一些临时整数列表,在其中获取所有 ID,对该列表进行排序,将数字与 my_list 中的拼接值进行比较,并从我的列表中获取名称,要清楚这是代码:

ArrayList<String> my_list = new ArrayList<String>();
ArrayList<String> sortedlist = new ArrayList<String>();
ArrayList<Integer> sortedTempIdlist = new ArrayList<Integer>();

my_list.add("0" + "::" + "ABC");
my_list.add("2" + "::" + "DBC");
my_list.add("1" + "::" + "DDC");
my_list.add("10" + "::" + "DBD");
my_list.add("22" + "::" + "DDD");
sortedTempIdlist(0);
sortedTempIdlist(2);
sortedTempIdlist(1);
sortedTempIdlist(10);
sortedTempIdlist(22);

Collections.sort(sortedTempIdlist);
for (int i = 0; i < sortedTempIdlist.size(); i++) {
    String temp = my_list.get(i);
    String[] s;

    try {
         s = temp.split("::");
         String name = s[1].toString();
         String id   = s[0].toString();

         for (String x : my_list) {
             Integer compare = Integer.valueOf(String.valueOf(x.split("::")[0]));
             if (sortedTempIdlist.get(i) == compare) { 
                  sortedlist.add(String.valueOf(sortedTempIdlist.get(i)) + "::" + String.valueOf(x.split("::")[1]));
             }
          }

    } catch (Exception e) {};
}

现在这项工作和排序列表没问题,但问题是当我有很多列表成员(比如说 600 或 1000)时,这项工作会变慢。 这样的事情有更快的方法吗?

感谢

【问题讨论】:

  • 为什么不将 id 和 string 包装在一个小对象中,并使用 Collections.sort() 和比较器根据 id 对列表进行排序? Collections.sort() 是 O(nlogn)
  • @Blackbelt 感谢!我尝试了你的方法,并且像魅力一样工作。:)
  • 也许更好的答案,如果有人有类似的问题,解决方案很棒。 :)

标签: android


【解决方案1】:

将 id 和 String 包装在一个小对象中:

public class Item {
   public int id;
   public String name;
}

并使用Collections.sort() 将列表重新排序为 id:

Collections.sort(listInstance, new Comparator<Item>() {
     @Override
     public int compare(Item lhs, Item rhs) {
           return lhs.id < rhs.id ? - 1 : (lhs.id == rhs.id ? 0 : 1) ;
     }
 });

Collections.sort() 将在O(nlogn) 中对您的列表进行排序

【讨论】: