在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
我想根据第一列对其进行排序,因此我的最终数据可能如下所示
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”的日期,第二列是字符串。
答案 0 :(得分:74)
基于一列对二维数组进行排序 第一列是格式为“yyyy.MM.dd HH:mm”的日期,第二列是字符串。
既然你说2-D数组,我假设“格式日期......”表示一个字符串。这是用于对String [] []:
的二维数组进行排序的代码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
答案 1 :(得分:12)
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;
}
}
通过这种方式,您可以处理这些数组中的任何类型的数据(只要它们是可比较的),并且您可以按升序或降序对任何列进行排序。
String[][] data = getData();
Arrays.sort(data, new ArrayComparator(0, true));
PS:请务必检查ArrayIndexOutOfBounds
和其他人。
编辑:如果您能够在第一列中实际存储java.util.Date
,或者您的日期格式允许您对这些值使用纯字符串比较,则上述解决方案将非常有用。否则,您需要将该String转换为Date,并且您可以使用回调接口(作为一般解决方案)来实现。这是一个增强版本:
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);
}
}
}
此时,您可以使用以下内容对第一列进行排序:
Arrays.sort(data, new ArrayComparator(0, true, new DateConverter());
我跳过了对空值和其他错误处理问题的检查。
我同意这已经开始看起来像一个框架。 :)强>
最后(希望)编辑:我现在才意识到你的日期格式允许你使用普通的字符串比较。如果是这种情况,则不需要“增强版本”。
答案 2 :(得分:8)
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]);
}
});
答案 3 :(得分:6)
安装java8 jdk + jre
使用 lamda表达式对 2D数组进行排序。
代码:
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
答案 4 :(得分:5)
假设您的数组包含字符串,您可以使用以下内容:
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);
}
});
如果你有一个二维数组,解决方案也非常相似:
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);
}
});
答案 5 :(得分:3)
查看ColumnComparator。它与Costi提出的解决方案基本相同,但它也支持对List中的列进行排序,并且还有一些排序属性。
答案 6 :(得分:3)
从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]]
答案 7 :(得分:1)
如果您正在寻找一种简单的衬板来对二维阵列进行排序,那么您就可以开始了。
按第一列的升序排列String [] [] arr
Arrays.sort(arr, (a, b) -> a[0].compareTo(b[0]);
按第一列的降序排列String [] [] arr
Arrays.sort(arr, (a, b) -> b[0].compareTo(a[0]);
按第二列的升序排列String [] [] arr
Arrays.sort(arr, (a, b) -> a[1].compareTo(b[1]);
按第二列的降序排列String [] [] arr
Arrays.sort(arr, (a, b) -> b[1].compareTo(a[1]);
按第一列的升序排列int [] [] arr
Arrays.sort(arr, (a, b) -> Integer.compare(a[0], b[0]));
或
Arrays.sort(arr, (a, b) -> a[0] - b[0]);
按第一列的降序排列int [] [] arr
Arrays.sort(arr, (a, b) -> Integer.compare(b[0], a[0]));
或
Arrays.sort(arr, (a, b) -> b[0] - a[0]);
按第二列的升序排列int [] [] arr
Arrays.sort(arr, (a, b) -> Integer.compare(a[1], b[1]));
或
Arrays.sort(arr, (a, b) -> a[1] - b[1]);
按第二列的降序排列int [] [] arr
Arrays.sort(arr, (a, b) -> Integer.compare(b[1], a[1]));
或
Arrays.sort(arr, (a, b) -> b[1] - a[1]);