基于一列对二维数组进行sorting

在Java中,我有我的数组中的数据,如下所示

2009.07.25 20:24 Message A 2009.07.25 20:17 Message G 2009.07.25 20:25 Message B 2009.07.25 20:30 Message D 2009.07.25 20:01 Message F 2009.07.25 21:08 Message E 2009.07.25 19:54 Message R 

我想根据第一列对其进行sorting,因此我的最终数据可能如下所示

 2009.07.25 19:54 Message R 2009.07.25 20:01 Message F 2009.07.25 20:17 Message G 2009.07.25 20:24 Message A 2009.07.25 20:25 Message B 2009.07.25 20:30 Message D 2009.07.25 21:08 Message E 

第一列是格式“yyyy.MM.dd HH:mm”的date,第二列是一个string。

基于一列对二维数组进行sorting
第一列是格式“yyyy.MM.dd HH:mm”的date,第二列是一个string。

既然你说二维数组,我认为“格式的date…”是指一个string。 这是用于对String [] []的二维数组进行sorting的代码:

 import java.util.Arrays; import java.util.Comparator; public class Asdf { public static void main(final String[] args) { final String[][] data = new String[][] { new String[] { "2009.07.25 20:24", "Message A" }, new String[] { "2009.07.25 20:17", "Message G" }, new String[] { "2009.07.25 20:25", "Message B" }, new String[] { "2009.07.25 20:30", "Message D" }, new String[] { "2009.07.25 20:01", "Message F" }, new String[] { "2009.07.25 21:08", "Message E" }, new String[] { "2009.07.25 19:54", "Message R" } }; Arrays.sort(data, new Comparator<String[]>() { @Override public int compare(final String[] entry1, final String[] entry2) { final String time1 = entry1[0]; final String time2 = entry2[0]; return time1.compareTo(time2); } }); for (final String[] s : data) { System.out.println(s[0] + " " + s[1]); } } } 

输出:

 2009.07.25 19:54 Message R 2009.07.25 20:01 Message F 2009.07.25 20:17 Message G 2009.07.25 20:24 Message A 2009.07.25 20:25 Message B 2009.07.25 20:30 Message D 2009.07.25 21:08 Message E 
 class ArrayComparator implements Comparator<Comparable[]> { private final int columnToSort; private final boolean ascending; public ArrayComparator(int columnToSort, boolean ascending) { this.columnToSort = columnToSort; this.ascending = ascending; } public int compare(Comparable[] c1, Comparable[] c2) { int cmp = c1[columnToSort].compareTo(c2[columnToSort]); return ascending ? cmp : -cmp; } } 

这样你可以处理这些数组中的任何types的数据(只要它们是Comparable),你可以按照升序或降序对任何列进行sorting。

 String[][] data = getData(); Arrays.sort(data, new ArrayComparator(0, true)); 

PS:确保你检查ArrayIndexOutOfBounds和其他。

编辑:上述解决scheme只会有帮助,如果你能够实际存储一个java.util.Date在第一列或者如果你的date格式允许你使用普通的string比较这些值 。 否则,您需要将该string转换为date,并且可以使用callback接口(作为一般解决scheme)来实现。 这是一个增强版本:

 class ArrayComparator implements Comparator<Object[]> { private static Converter DEFAULT_CONVERTER = new Converter() { @Override public Comparable convert(Object o) { // simply assume the object is Comparable return (Comparable) o; } }; private final int columnToSort; private final boolean ascending; private final Converter converter; public ArrayComparator(int columnToSort, boolean ascending) { this(columnToSort, ascending, DEFAULT_CONVERTER); } public ArrayComparator(int columnToSort, boolean ascending, Converter converter) { this.columnToSort = columnToSort; this.ascending = ascending; this.converter = converter; } public int compare(Object[] o1, Object[] o2) { Comparable c1 = converter.convert(o1[columnToSort]); Comparable c2 = converter.convert(o2[columnToSort]); int cmp = c1.compareTo(c2); return ascending ? cmp : -cmp; } } interface Converter { Comparable convert(Object o); } class DateConverter implements Converter { private static final DateFormat df = new SimpleDateFormat("yyyy.MM.dd hh:mm"); @Override public Comparable convert(Object o) { try { return df.parse(o.toString()); } catch (ParseException e) { throw new IllegalArgumentException(e); } } } 

在这一点上,你可以在你的第一列中sorting:

 Arrays.sort(data, new ArrayComparator(0, true, new DateConverter()); 

我跳过了对空值和其他error handling问题的检查。

我同意这已经开始看起来像一个框架已经。 🙂

最后(希望)编辑:我现在才意识到你的date格式允许你使用纯string比较。 如果是这种情况,则不需要“增强版”。

 Arrays.sort(yourarray, new Comparator() { public int compare(Object o1, Object o2) { String[] elt1 = (String[])o1; String[] elt2 = (String[])o2; return elt1[0].compareTo(elt2[0]); } }); 

假设你的数组包含string,你可以使用下面的代码:

 String[] data = new String[] { "2009.07.25 20:24 Message A", "2009.07.25 20:17 Message G", "2009.07.25 20:25 Message B", "2009.07.25 20:30 Message D", "2009.07.25 20:01 Message F", "2009.07.25 21:08 Message E", "2009.07.25 19:54 Message R" }; Arrays.sort(data, new Comparator<String>() { @Override public int compare(String s1, String s2) { String t1 = s1.substring(0, 16); // date/time of s1 String t2 = s2.substring(0, 16); // date/time of s2 return t1.compareTo(t2); } }); 

如果你有一个二维数组,解决scheme也非常相似:

 String[][] data = new String[][] { { "2009.07.25 20:17", "Message G" }, { "2009.07.25 20:25", "Message B" }, { "2009.07.25 20:30", "Message D" }, { "2009.07.25 20:01", "Message F" }, { "2009.07.25 21:08", "Message E" }, { "2009.07.25 19:54", "Message R" } }; Arrays.sort(data, new Comparator<String[]>() { @Override public int compare(String[] s1, String[] s2) { String t1 = s1[0]; String t2 = s2[0]; return t1.compareTo(t2); } }); 
  1. 安装java8 jdk + jre

  2. 使用lamdaexpression式二维数组进行sorting。

码:

 import java.util.Arrays; import java.util.Comparator; class SortString { public static void main(final String[] args) { final String[][] data = new String[][] { new String[] { "2009.07.25 20:24", "Message A" }, new String[] { "2009.07.25 20:17", "Message G" }, new String[] { "2009.07.25 20:25", "Message B" }, new String[] { "2009.07.25 20:30", "Message D" }, new String[] { "2009.07.25 20:01", "Message F" }, new String[] { "2009.07.25 21:08", "Message E" }, new String[] { "2009.07.25 19:54", "Message R" } }; // this is applicable only in java 8 version. Arrays.sort(data, (String[] s1, String[] s2) -> s1[0].compareTo(s2[0])); // we can also use Comparator.comparing and point to Comparable value we want to use // Arrays.sort(data, Comparator.comparing(row->row[0])); for (final String[] s : data) { System.out.println(s[0] + " " + s[1]); } } } 

产量

 2009.07.25 19:54 Message R 2009.07.25 20:01 Message F 2009.07.25 20:17 Message G 2009.07.25 20:24 Message A 2009.07.25 20:25 Message B 2009.07.25 20:30 Message D 2009.07.25 21:08 Message E 

查看ColumnComparator 。 它与Costi提出的解决scheme基本相同,但它也支持对列表中的列进行sorting,并具有更多的sorting属性。

自java 8开始使用Lambdas:

 final String[][] data = new String[][] { new String[] { "2009.07.25 20:24", "Message A" }, new String[] { "2009.07.25 20:17", "Message G" }, new String[] { "2009.07.25 20:25", "Message B" }, new String[] { "2009.07.25 20:30", "Message D" }, new String[] { "2009.07.25 20:01", "Message F" }, new String[] { "2009.07.25 21:08", "Message E" }, new String[] { "2009.07.25 19:54", "Message R" } }; String[][] out = Arrays.stream(data).sorted(Comparator.comparing(x -> x[1])).toArray(String[][]::new); System.out.println(Arrays.deepToString(out)); 

输出:

[2009.07.25 20:24,讯息A],[2009.07.25 20:25,讯息B],[2009.07.25 20:30,讯息D],[2009.07.25 21:08,讯息E],[ 2009.07.25 20:01,留言F],[2009.07.25 20:17,留言G],[2009.07.25 19:54,留言R]]