2011-10-16 2 views
1

Я пытаюсь создать неизменяемый класс, в котором представлены натуральные числа. Я использую рекурсию для обработки методов Increment and 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, vs возвращаете результат 'temp.increment()', если ваш класс предположительно непреложный? –

ответ

1

ли не полностью посмотрел в него, но если SlowBigNatural действительно правильно неизменны, тогда следующее:

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

вряд ли будет полезным, насколько я могу видеть. Вышеуказанный вызов temp.increment() создает новый объект, который вы игнорируете, видите, что вы возвращаете temp сам, а не результат temp.increment().

могли бы попытаться изменить выше этого:

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

А если работает, то же самое для декремента().

+0

Я пробовал ваше предложение, и теперь я получаю случайную бред, когда устанавливаю новый BigNatural, равный приросту BigNatural. В настоящее время я пытаюсь выполнить код, чтобы узнать, где именно я ошибаюсь. – Franklin

Смежные вопросы