如何在java中按特定列对int的2D数组进行排序
我有一个包含日期的二维整数数组:月份在索引0处,日期在索引1处,年份在索引2处如何在java中按特定列对int的2D数组进行排序,java,arrays,sorting,Java,Arrays,Sorting,我有一个包含日期的二维整数数组:月份在索引0处,日期在索引1处,年份在索引2处 date [0][0] = 10; date [0][1] = 14; date [0][2] = 2013; System.out.println(date[0][0] + "-" + date[0][1] + "-" + date[0][2]); 输出: 10-14-2013 如果我有很多这样的日期,是否可以按时间顺序对这些日期进行排序 这就是我到目前为止所做的: for(int i =0; i < d
date [0][0] = 10;
date [0][1] = 14;
date [0][2] = 2013;
System.out.println(date[0][0] + "-" + date[0][1] + "-" + date[0][2]);
输出:
10-14-2013
如果我有很多这样的日期,是否可以按时间顺序对这些日期进行排序
这就是我到目前为止所做的:
for(int i =0; i < date.length; i++)
{
Arrays.sort(date[i]);
}
for(int i=0;i
但这却让我的日子和月份发生了变化
搜索之后,我发现堆栈上有几个人正在使用comparator类进行排序。可以使用它吗?为什么不使用一个对象数组呢?它似乎已经实现了您试图使用此2D阵列执行的操作
实际上应该使用它将上面的链接抽象日期属性日、月、年替换为自定义日期对象
public class Date{
int day;
int month;
int year;
}
Date类应该实现comparator/comparable接口,然后提供compare/comareTo方法实现
然后,您可以使用内置Java的排序方法对数组/日期对象列表进行排序 创建一个日期对象。只需将字符串解析为月、日和年。 然后实现compareTo接口
Public class Date implements compareTo{
private int day,month,year;
public Date(int d,int m,int y ){
day=d;
month=m;
year=y;
}
public int compareTo(Date date){
if(year<date.year)
return -1;
else if(year>date.year)
return 1;
else if(year==date.year)
if(month<date.month)
return -1
else if (month>date.month)
return 1;
else if(month==date.month)
if (day>date.day)
return 1;
else if (day<date.day)
return -1;
else return 0; //i.e the two dates are equal since they have the same day,month and year
}
}
公共类日期实现比较{
私人国际日、月、年;
公开日期(整数d、整数m、整数y){
d=d;
月=m;
年份=y;
}
公共整数比较(日期){
如果(yeardate.year)
返回1;
else if(年份==日期年)
如果(月日月)
返回1;
else if(月==日期月)
如果(天>日期.天)
返回1;
否则,如果(day如果要保留数组结构,请使用类似于计数/基数排序的方法将节省时间
第一:对于年份,将具有相同年份的项目的所有索引存储到一个列表中
对于每个年度列表,按照与年度类似的方式按月份对其排序
每天做类似的事情
每年打印所有索引。享受:)
但具有内置可比较方法的日期类型将是最好的
注意:实际上,关键是使用索引,并使用一些稳定排序从3个不同角度对它们进行排序:年、月和日
查看您的评论,您可以使用将字符串转换为日期尽管使用日期对象(您在中)更有意义,但使用自定义比较器对二维数组排序并不困难:
Arrays.sort(data, new Comparator<int[]>() {
public int compare(int[] a, int[] b) {
// compare years
if (a[2] == b[2]) {
// compare months
if (a[0] == b[0]) {
return Integer.compare(a[1], b[1]);
} else {
// compare days
return Integer.compare(a[0], b[0]);
}
} else {
return Integer.compare(a[2], b[2]);
}
}
});
Arrays.sort(数据,新比较器(){
公共整数比较(整数[]a,整数[]b){
//比较年份
如果(a[2]==b[2]){
//比较月份
如果(a[0]==b[0]){
返回整数。比较(a[1],b[1]);
}否则{
//比较天
返回整数。比较(a[0],b[0]);
}
}否则{
返回整数。比较(a[2],b[2]);
}
}
});
索引1月的日期索引0?不确定是否有14个月…使用比较器是正确的方法。不相关,但最好使用类来表示一个日期,而不是数组。我想说的是@Henry,OP do you knownOOP
?这样做很容易。如果您使用年mm dd格式转换为字符串(或yyyymmdd),您可以利用字典式字符串排序,但您可能应该使用SimpleDateFormat
。如果我有一个字符串:“10-12-2013”我可以将其作为日期对象吗?因为我首先有一个字符串,然后将其转换为2d数组,以便通过Integer.parseInt(“1234”)将字符串转换为int