Java中数组的ArrayList排序

Posted

技术标签:

【中文标题】Java中数组的ArrayList排序【英文标题】:Sort ArrayList of Array in Java 【发布时间】:2011-06-09 15:30:24 【问题描述】:

在 Java 中对ArrayList<String[]> 进行排序的最佳方法是什么?

String[] 在哪里...

String[] strAarray = new String[]  "abc", "abc", "abc", "abc", "abc", "abc", "abc" ;

现在我想按 String[] 的第二个值(在索引 1 处)对整个 ArrayList 进行排序。我需要遍历每个String[],然后遍历索引 1 处的子节点。

有什么想法吗?

编辑:


我有更多的描述。我实际上是从一些 XML 文件中获取学校,并且 XML 中的每个节点都有 7 个属性。现在我正在创建一个 String[] 的 ArrayList,它保存来自 XML 的那些学校节点,而 String[] strArray 本身保存着特定节点的属性。

现在,我要对其进行排序,它应该根据 State of school 排序,这是 XML 中的第二个属性和 ArrayList 内 String[] 中的索引 1。

我需要先遍历每个 School(XML 中的节点,Java 中的 String[]),然后我必须过滤状态(XML 中的状态属性,Java 中的 String[1])。

【问题讨论】:

我在任何地方都看不到任何 ArrayList,而且您的字符串数组中的所有内容都是相同的... 请尝试进一步解释一下,发布一些输入参数和异常结果。 使用对象而不是列表、数组和字符串会更好。 Java 是一种面向对象的语言。您遇到了麻烦,因为您认为 XML 级别太低不是一个好的抽象。 【参考方案1】:

您编写一个Comparator,比较正确孩子的两个String[],然后将其传递给Collections.sort(List<T> list, Comparator<? super T> c)

【讨论】:

【参考方案2】:

使用 TreeSet 或 TreeMap http://download.oracle.com/javase/6/docs/api/java/util/TreeSet.html

【讨论】:

【参考方案3】:

以Collections.sort, the one that takes a custom Comparator 开头。您还需要为此编写自定义Comparator。

例如,假设您要依赖其 compareTo 方法中定义的字符串的自然排序:

public static void main(String[] args) throws Exception 
        ArrayList<String[]> listOfStringArrays = new ArrayList<String[]>();
        listOfStringArrays.add(new String[] "x","y","z");
        listOfStringArrays.add(new String[] "a","b","c");
        listOfStringArrays.add(new String[] "m","n","o");
        Collections.sort(listOfStringArrays,new Comparator<String[]>() 
            public int compare(String[] strings, String[] otherStrings) 
                return strings[1].compareTo(otherStrings[1]);
            
        );
        for (String[] sa : listOfStringArrays) 
            System.out.println(Arrays.toString(sa));
        
        /* prints out 
          [a, b, c]
          [m, n, o]
          [x, y, z]
        */ 

    

【讨论】:

请注意,这实际上是按索引 1 排序的。如果您将“y”更改为“a”,那么它将按顺序打印出来。 我不确定我是否理解这条评论。该问题要求根据索引 1 进行排序。输入的顺序无关紧要。【参考方案4】:

您像这样创建Comparator&lt;String[]&gt;

new Comparator<String[]>() 
  public int compare(String[] first, String[] second) 
    return first[1].compareTo(second[1]);
  

然后将其传递给Collections.sort()

您可能想要检查第二个元素是否确实存在于数组中。如果标准字符串比较不够,您也可以进行自定义比较。

【讨论】:

我在想它如何按状态按升序对整个 ArrayList 进行排序? 它会按照 Jorn 和我展示的方式升序排列。如果您希望它以另一个顺序排列,那么您可以否定从 String.compareTo(String) 返回的值,或者在第一次排序后调用 Collections.reverse(yourList)。【参考方案5】:

根据您的编辑:您的 String[] 应该是包含您的属性的 School 对象。让你的 School 对象实现 Comparable,这样就可以使用 Collections.sort() 轻松排序。

【讨论】:

【参考方案6】:

这在 Java 8 中非常容易做到。只需编写:

list.sort(Comparator.comparing(a -> a[1]));

例如下面的代码:

List<String[]> list = Arrays.asList(
    new String[]  "abc", "abc", "abc", "abc", "abc", "abc", "abc" ,
    new String[]  "xyz", "xyz", "xyz", "xyz", "xyz", "xyz", "xyz" ,
    new String[]  "fgh", "fgh", "fgh", "fgh", "fgh", "fgh", "fgh" );

list.sort(Comparator.comparing(a -> a[1]));
list.stream().map(Arrays::toString).forEach(System.out::println);

将产生想要的结果:

[abc, abc, abc, abc, abc, abc, abc]
[fgh, fgh, fgh, fgh, fgh, fgh, fgh]
[xyz, xyz, xyz, xyz, xyz, xyz, xyz]

【讨论】:

【参考方案7】:

假设我们有一个数组列表[["x", "y","z"], ["a", "b", "c"], ["m", "n", "o"]]

我们可以使用 list.sort() 代替 Collections.sort()。

为了排序,我们可以采用更简洁的方式,使用 lambda 和方法引用。

使用 lambda:

listOfStrings.sort((a, b)->a[1].compareTo(b[1]));

使用方法参考:

listOfStrings.sort(Comparator.comparing(a->a[1]));

输出:

[a, b, c]
[m, n, o]
[x, y, z]

【讨论】:

以上是关于Java中数组的ArrayList排序的主要内容,如果未能解决你的问题,请参考以下文章

java中list和arraylist的区别

Java对List集合的排序

java arraylist怎么转化成数组

java Collections排序问题

java list排序出错

java 怎么将List里面数据排序