繁体   English   中英

在java中对Arraylist <String>的ArrayList进行排序

[英]Sorting ArrayList of Arraylist<String> in java

我有一个StringList的ArrayList。

在每个索引的外部ArrayList中,每个Inner ArrayList有四个项目有四个参数。

  1. 联系人ID
  2. 联系人姓名
  3. 联系地址
  4. 联系电话

现在我想根据Contact Name Parameter对完整的ArrayList进行排序。

意味着我想访问外部Arraylist并且外部Arraylist的每个索引上存在的内部ArrayList应该根据联系人名称进行排序。

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

Collection.sort无法帮助我

排序豆的Arraylist Arraylist 我已阅读这篇文章,但它是ArrayListArrayList<Object> 如何弄清楚这个问题?

假设列表中的列表在订单ID,名称,地址和编号中具有字符串(即名称在索引1处),您可以使用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 (就像我在这段代码中所做的那样)。

我觉得发布这个很糟糕,因为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));
    }
});
  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));
          }

      }
  }

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

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

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

比较器/可比较接口无法帮助,因为我没有任何对象。

不正确。 你有对象。 您尝试排序的所有内容都是对象。

如果您尝试在ArrayList<ArrayList<String>>ArrayList<String>对象进行排序,则需要实现Comparator<ArrayList<String>> (可比方法对于这个数据结构来说是错误的。你需要声明一个ArrayList的自定义子类......那就太糟了!)


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


其他答案显示如何基于列表中的一个字段实现Comparator。 这可能就足够了,但它会给你一个排序顺序,其中一对不同的“约翰史密斯”的顺序是不确定的。 (我会使用第二个字段作为打破平局。如果id是唯一的,Id字段将是理想的。)

你应该为你的数据结构创建一个类(如果你不能,那么请指明原因。我看不出任何好的理由):

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>();

对它进行排序将是微不足道的。

使用以下比较器:

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是arraylist的索引,它对应于Contact Name。 在你的情况下“1”

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM