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<String[]>
:
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排序的主要内容,如果未能解决你的问题,请参考以下文章