Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中按特定列对int的2D数组进行排序_Java_Arrays_Sorting - Fatal编程技术网

如何在java中按特定列对int的2D数组进行排序

如何在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

我有一个包含日期的二维整数数组:月份在索引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 < 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 known
OOP
?这样做很容易。如果您使用年mm dd格式转换为字符串(或yyyymmdd),您可以利用字典式字符串排序,但您可能应该使用
SimpleDateFormat
。如果我有一个字符串:“10-12-2013”我可以将其作为日期对象吗?因为我首先有一个字符串,然后将其转换为2d数组,以便通过Integer.parseInt(“1234”)将字符串转换为int