我正在嘗試創建一個表示自然數的不可變類。我使用遞歸來處理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+(?!$)", "");
}
}
我跨過我的代碼,並且當我將數組轉換爲字符串並將其傳遞給構造函數時,似乎發生錯誤。它將數組變成一堆瘋狂。繼續調查。
你的代碼沒有多大意義。例如,爲什麼在這個語句中,'if(nSize == 1 || nClone [nSize-1]!= HIGHEST)' - 你測試nSize == 1?爲什麼在接下來的其他章節中,如果你的類被認爲是不可變的,你會先執行'temp.increment()'然後返回temp,然後返回'temp.increment()'的結果? –