2011-10-16 60 views
1

我正在嘗試創建一個表示自然數的不可變類。我使用遞歸來處理Increment和Decrement方法。由於這些字段是最終的,我做了一個私有構造函數來在遞減/遞增時將新值賦給必要的字段。在測試這個實現之後,我似乎無法指出問題所在。如果我遞減100,那麼它將是10.如果我遞增99,它將是9.如果我遞增/遞減一個不在邊界上的數字,我會得到一長串亂碼。我想我需要向正確的方向推動。如果它是可變的,我可以很好地工作,因爲我不必擔心最後的字段。製作一個不可改變的類

public final class SlowBigNatural implements BigNatural{ 
final private int natural[]; 
final private int nSize; 
final private int HIGHEST = 9; 

public SlowBigNatural() { 
    this.nSize = 1; 
    this.natural = new int[1]; 
    this.natural[0] = 0; 
} 

public SlowBigNatural(int p) { 
    this(Integer.toString(p)); 
} 

public SlowBigNatural(String s) { 
    this.nSize = s.length(); 
    this.natural = new int[nSize]; 
    for (int i = 0; i < nSize; i++) { 
     this.natural[i] = Character.digit(s.charAt(i), 10); 
    } 
} 

public SlowBigNatural(BigNatural c) { 
    this(c.toString()); 
} 

private SlowBigNatural(int[] natural, int nSize){ 
    this.nSize = nSize - 1; 
    this.natural = new int[this.nSize]; 
    for (int i = 0; i < this.nSize; i++) { 
     this.natural[i] = natural[i]; 
    } 
} 

public BigNatural increment() { 
    int[] nClone = new int[nSize]; 
    System.arraycopy(natural, 0, nClone, 0, nSize); 
    if (nSize == 1 || nClone[nSize - 1] != HIGHEST) { 
     nClone[nSize - 1]++; 
     BigNatural nInc = new SlowBigNatural(nClone.toString()); 
     return nInc; 
    } 

    else { 
     nClone[nSize - 1] = 0; 
     BigNatural temp = new SlowBigNatural(nClone, nSize); 
     temp.increment(); 
     return temp; 
    } 
} 

public BigNatural decrement() { 
    int[] nClone = natural.clone(); 
    if (nClone[nSize - 1] != 0) { 
     nClone[nSize - 1]--; 
     BigNatural nDec = new SlowBigNatural(nClone.toString()); 
     return nDec; 
    } 
    else { 
     if (nSize != 1) { 
      nClone[nSize - 1] = HIGHEST; 
      BigNatural temp = new SlowBigNatural(nClone, nSize); 
      temp.decrement(); 
      return temp; 
     } 
     else{ 
      BigNatural nDec = new SlowBigNatural(0); 
      return nDec; 
     } 
    } 
} 

public String toString() { 
    String nString = ""; 
    for (int i = 0; i < nSize; i++) { 
     nString += String.valueOf(natural[i]); 
    } 
    return nString.replaceFirst("^0+(?!$)", ""); 
} 
} 

我跨過我的代碼,並且當我將數組轉換爲字符串並將其傳遞給構造函數時,似乎發生錯誤。它將數組變成一堆瘋狂。繼續調查。

+0

你的代碼沒有多大意義。例如,爲什麼在這個語句中,'if(nSize == 1 || nClone [nSize-1]!= HIGHEST)' - 你測試nSize == 1?爲什麼在接下來的其他章節中,如果你的類被認爲是不可變的,你會先執行'temp.increment()'然後返回temp,然後返回'temp.increment()'的結果? –

回答

1

還沒有完全看着它,但如果SlowBigNatural真的是正確不可改變的,那麼下面:

BigNatural temp = new SlowBigNatural(nClone, nSize); 
temp.increment(); 
return temp; 

不太可能是有用的,據我可以看到。以上呼籲temp.increment()創建一個新對象,您忽略,看到您返回臨時本身,而不是temp.increment()的結果。

你能嘗試改變上述這樣:

BigNatural temp = new SlowBigNatural(nClone, nSize); 
return temp.increment(); 

如果作品,爲遞減()這樣做。

+0

我嘗試了你的建議,現在當我設置一個新的BigNatural等於增加的BigNatural時,我會隨機亂讀。我目前正試圖通過代碼,看看我到底發生了什麼錯誤。 – Franklin