日期排序问题!我感觉我的算法没有问题呀!为什么执行出来的结果排序不对呢?我想知道哪里出了问题,应该如何改正,谢谢!public class BubbleSort
{
public static void main(String[] args)
{
Date[] a = new Date[5];
a[0] = new Date(2006, 5, 4);
a[1] = new Date(2006, 7, 4);
a[2] = new Date(2008, 5, 4);
a[3] = new Date(2004, 5, 9);
a[4] = new Date(2004, 5, 4);

sort(a);

for(int i=0; i<a.length; i++)
{System.out.println(a[i]);}
}
public static Date[] sort(Date[] array)
{
int k; //用于存储内层循环中compare出来的值
Date temp;
for(int i=array.length-1; i>=0; i--)
{
for(int j=0; j<i; j++)
{
k = array[j].compare(array[j+1]);
if(k > 0)
{
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
return array;
}
}class Date
{
int year, month, day;
Date(int year, int month, int day)
{
this.year = year;
this.month = month;
this.day = day;
}

public int compare(Date d)
{
if(this.year > d.year)
{return 1;}
else if(this.month > d.month)
{return 1;}
else if(this.day > d.day)
{return 1;}
else
{return -1;}
}

public String toString()
{
return "datetime is: " + this.year + " - " + this.month + " - " + this.day;
}}

解决方案 »

  1.   

    if(this.year > d.year) 
    {return 1;} 
    else if(this.month > d.month) 
    {return 1;} 
    else if(this.day > d.day) 
    {return 1;} 
    else 
    {return -1;} 
    这个函数有问题吧?如果两个年份不同,就比较月份?2008 - 5 - 4就比2006 - 7 - 4小拉,按这个函数
      

  2.   

    for(int i=array.length-1; i>=0; i--) 

    for(int j=0; j <i; j++) 这两个for循环,方向不一致造成的。自己看看算法,比较排序法,两层循环方向要一致才行。
      

  3.   

    我把这个方法重新改了一下,一切就都对了!
    感觉很烦琐,不知道有没有更简便的方法(不要三目运算符的方法!)
    public int compare(Date d)
    {
    if(this.year > d.year)
    {return 1;}
    else if(this.year < d.year)
    {return -1;}
    else
    {
    if(this.month > d.month)
    {return 1;}
    else if(this.month < d.month)
    {return -1;}
    else
    {
    if(this.day > d.day)
    {return 1;}
    else
    {return -1;}
    }
    }
    }
      

  4.   

        public int compare(Date d) {
            return this.hashCode() - d.hashCode();
        }
        
        public int hashCode() {
            return this.day + this.month * 100 + this.year * 10000;
        }