2016-11-28 199 views
-2

我寫了一天類,現在我想比較一天中的兩個對象,以查看哪一天是在之後。compareTo導致堆棧溢出

但問題是,當我試圖用的compareTo到兩天相比,它會導致堆棧溢出

這是一天班,我創建,請幫忙看看,爲什麼我不能使用的compareTo。

public class Day implements Cloneable,Comparable<Day>{ 

private int year; 
private int month; 
private int day; 

private static final String MonthNames="JanFebMarMayJunJulAugSepOctNovDec"; 
//Constructor 
public Day(int y, int m, int d) { 
    this.year=y; 
    this.month=m; 
    this.day=d;  
} 


public void set(String sDay) 
{ 
    String[] sDayParts = sDay.split("-"); 
    this.year = Integer.parseInt(sDayParts[2]); 
    this.day = Integer.parseInt(sDayParts[0]); 
    this.month = MonthNames.indexOf(sDayParts[1])/3+1; 
} 

public Day(String sDay) 
{ 
    set(sDay); 


} 


// Return a string for the day like dd MMM yyyy 
public String toString() { 

    return day+"-"+ MonthNames.substring((month-1)*3,month*3)+ "-"+ year; 
} 



@Override 
public int compareTo(Day another) 
{ 

    return this.compareTo(another); 
} 
+6

當然是的。你所有的compareTo方法都會調用它自己! –

回答

4

你有一種方法,無休止地調用itseld,直到堆棧爆炸。

@Override 
public int compareTo(Day another) 
{ 
    return this.compareTo(another); // calls itself until the stack is exhuased 
} 

你需要做的是比較類的字段。例如

@Override 
public int compareTo(Day d) { 
    int cmp = Integer.compare(year, d.year); 
    if (cmp == 0) cmp = Integer.compare(month, d.month); 
    if (cmp == 0) cmp = Integer.compare(day, d.day); 
    return cmp; 
} 
0

你有一個很好的無限遞歸正在進行。

@Override 
public int compareTo(Day another) 
{ 

    return this.compareTo(another); 
} 

這是一個遞歸調用。您必須實際實施您自己的compareTo機身,例如檢查日期