#java #list #methods
#java #Список #методы
Вопрос:
Я реализую класс списков больших чисел (динамический список) и пытаюсь представить полученное длинное число в виде списка
например: 98765432123
будет отображаться как: 9-8-7-6-5-4-3-2-1-2-3 каждая цифра является узлом. Список.
использование другого класса с простыми методами (класс IntNode):
private int _value;
private IntNode node;
public IntNode(int val) {
_value = val;
node = null;
}
public IntNode(int val, IntNode next) {
_value = val;
node = next;
}
public int get_value() {
return _value;
}
public void set_next(IntNode _next) {
this.node = _next;
}
public void set_value(int _value) {
this._value = _value;
}
public IntNode get_next() {
return node;
}
Атрибуты класса BigDecimal :
private IntNode _head
Я использую конструктор для получения длинного числа и представления его в виде списка путем добавления каждой цифры в узел.
но при попытке добавить новую цифру в следующий узел возникает исключение NullPointerException, потому что следующий узел имеет значение null.
любая помощь в том, как это сделать без использования хэш-карт arrayslist и т. Д., Была бы признательна!!
вот мой код, в котором я получаю ошибку NullPointerException, добавляя каждую цифру в отдельный узел.:
public BigDecimalNum(long num) {
_head=new IntNode((int)num%10); // set node to first digit
while(num>0) {
_head.get_next().set_value((int)num % 10); // set next node to next digit.
num/=10;
}
Комментарии:
1. Зачем использовать такой неэффективный способ?
2. что вы подразумеваете под неэффективным способом? не используется список массивов? потому что это упражнение для понимания того, как работают эти методы
3. Вы используете один элемент на цифру. Цифры не являются естественными для двоичных чисел. Используйте байты, короткие или целые числа.
Ответ №1:
Простым способом было бы использовать строковое представление числа:
long num = 98765432123L;
String numStr= String.valueOf(num);
System.out.println(numStr);
String[] arr = numStr.split("");
String lst = String.join("-",arr);
System.out.print(lst);
что дает вывод:
98765432123
9-8-7-6-5-4-3-2-1-2-3
Ответ №2:
Я изменил ваш IntNode
класс, чтобы упростить пример.
BigDecimalNum bd = new BigDecimalNum(12345l);
System.out.println(bd);
С принтами
1-2-3-4-5
BigDecimalNum
конструктор в основном перебираетlong
значение и добавляет цифру в связанный список.- Поскольку вы хотите
head
, чтобы указывать на цифру старшего порядка, связанный список строится в обратном направлении, при этом заголовок меняется каждый раз. - Затем оно исправляется путем перемещения на первый допустимый узел.
class BigDecimalNum {
IntNode _head = new IntNode();
public BigDecimalNum(long num) {
while(num > 0) {
_head = _head.addNode((int)(num % 10));
num/=10;
}
_head = _head.next;
}
class IntNode {
private int _value;
private IntNode next;
public IntNode() {
}
- добавляет новое значение и возвращает следующий узел после настройки
нового узла для установки рядом с предыдущим.
public IntNode addNode(int val) {
_value = val;
IntNode t = new IntNode();
t.next = this;
return t;
}
}
Я также добавил toString
BigDecimalNum
в класс метод для отображения связанного списка. Поскольку у вас есть только один BigDecimalNum
конструктор, который должен занимать много времени, не было необходимости проверять, был ли заголовок null.
public String toString() {
StringBuilder sb = new StringBuilder().append(_head._value);
IntNode start = _head.next;
while(start != null) {
sb.append("-").append(start._value);
start = start.next;
}
return sb.toString();
}
}
Ответ №3:
Возможно, вы можете создать новый объект IntNode и использовать метод set_next() . Вы также должны обновлять «_head» в каждом цикле. В противном случае вы всегда обновляли бы вторую запись в списке. Я придумал этот код:
public static IntNode BigDecimalNum(long num) {
IntNode _head = new IntNode((int)num%10); // set node to first digit
num/=10; // go to second digit
IntNode digit = _head;
while (num>0) {
IntNode nextDigit = new IntNode((int)num % 10);
digit.set_next(nextDigit); // set next node to next digit.
num/=10;
digit = nextDigit;
}
return _head;
}
Комментарии:
1. Почему вы возвращаете
IntNode
при вызове BigDecimalNum ? И почему процедура статична?IntNode
это то, что должно быть скрыто от пользователя.