5

我有一个字符串的 ArrayList 的 ArrayList。

在 Outer ArrayList 中,每个索引上的每个 Inner ArrayList 都有四个项目和四个参数。

  1. 联系人 ID
  2. 联系人姓名
  3. 联系人地址
  4. 联络号码

现在我想根据联系人姓名参数对完整的 ArrayList 进行排序。

意味着我要访问外部 Arraylist,外部 Arraylist 的每个索引上存在的内部 ArrayList 应根据联系人姓名进行排序。

比较器/可比较接口不太可能帮助我。

Collection.sort 帮不了我

对 Bean 的 Arraylist 的 Arraylist 进行排序。我已经阅读了这篇文章,但它是ArrayList针对ArrayList<Object>. 如何解决这个问题?

4

7 回答 7

21

假设您的列表中的列表具有顺序 id、名称、地址和编号的字符串(即名称位于索引 1),您可以使用 a Comparator,如下所示:

List<List<String>> list;
Collections.sort(list, new Comparator<List<String>> () {
    @Override
    public int compare(List<String> a, List<String> b) {
        return a.get(1).compareTo(b.get(1));
    }
});

顺便说一句,您使用的是不是很重要ArrayList:使用抽象类型声明变量是一种很好的编程习惯,即List(正如我在这段代码中所做的那样)。

于 2013-04-24T06:27:59.340 回答
4

我感觉很糟糕发布这个,因为这List<Contact>将是更好的选择。不过,这样的事情是可能的:

ArrayList<ArrayList<String>> yourList = ...
Collections.sort(yourList, new Comparator<ArrayList<String>>() {
    @Override
    public int compare(ArrayList<String> one, ArrayList<String> two) {
        return one.get(1).compareTo(two.get(1));
    }
});
于 2013-04-24T06:23:40.357 回答
3
  import java.util.Collections;
  import java.util.Comparator;
  import java.util.List;


  public class ListsUtils {

      public static void sortListOfLists(List < List < String >> listOfLists) {

          // first sort the inner arrays using collections.sort
          for (List < String > innerList: listOfLists) {
              Collections.sort(innerList);
          }

          // now sort by comparing the first string of each inner list using a comparator
          Collections.sort(listOfLists, new ListOfStringsComparator());
      }

      static final class ListOfStringsComparator implements Comparator < List < String >> {

          @
          Override
          public int compare(List < String > o1, List < String > o2) {
              // do other error checks here as well... such as null. outofbounds, etc
              return o1.get(0).compareTo(o2.get(0));
          }

      }
  }

我想我只是假设您必须对字符串数组列表进行排序......这就是为什么我首先对内部数组列表进行排序,然后通过比较每个数组的第一项来对外部列表进行排序。没有阅读您在答案中的联系人。

在这种情况下,删除用于对内部列表进行排序的 for 循环,您仍然应该能够使用比较器进行排序,但与正确的索引而不是第一个元素进行比较。

Collections.sort(listOfLists, new ListOfStringListComparator());

于 2013-04-25T12:20:29.597 回答
1

Comparator / Comparable Interfaces 无济于事,因为我没有任何对象。

不正确。你确实有对象。您尝试排序的所有事物都是对象。

如果您尝试对 a 中的ArrayList<String>对象进行排序ArrayList<ArrayList<String>>,则需要实现 a Comparator<ArrayList<String>>。(这种数据结构的 Comparable 方法是错误的。您需要声明 ArrayList 的自定义子类......这太糟糕了!)


但更好的主意是用自定义类来表示您的对象。在这种情况下,您ArrayList of String应该是一个Contact具有 4 个字段、getter 和(如果需要)setter 的自定义类。然后您将其声明为 implementation Comparable<Contact>,并实现该compareTo方法。


其他答案显示了如何仅基于列表的一个字段来实现比较器。这可能就足够了,但它会给你一个排序顺序,其中一对不同的“John Smith”的顺序是不确定的。(我会使用第二个字段作为决胜局。如果 id 是唯一的,则 Id 字段将是理想的。)

于 2013-04-24T06:20:04.953 回答
1

您应该为您的数据结构创建一个类(如果不能,请说明原因。我看不出有什么好的理由不这样做):

public class Contact implements Comparable {
    private String id;
    private String name;
    private String address;
    private String number;

    // Getters and setters, and compareTo.
}

然后在您的列表中使用它:

List<Contact> contacts = new ArrayList<Contacts>();

然后对其进行排序将是微不足道的。

于 2013-04-24T06:21:04.130 回答
1

使用以下比较器:

class MyComparator implements Comparator<ArrayList<String>> {
    private static int indexToCompare = 1;
    @Override
    public int compare(ArrayList<String> o1, ArrayList<String> o2) {
        return o1.get(indexToCompare).compareTo(o2.get(indexToCompare));
    }

}

indexToCompare是对应于联系人姓名的数组列表的索引。在你的情况下“1”

于 2013-04-24T06:26:47.263 回答
0

我认为这是不将集合视为一流对象的情况。有一个名为“Contact”的新类,而不是将其抽象为 ArrayList,并使用 Comparator。

于 2013-04-24T06:20:45.590 回答