#java
#java
Вопрос:
Я создаю метод public boolean add (int index, E elem)
, который добавляет элемент в расположение индекса в моем связанном списке, но каждый раз, когда я получаю IndexOutOfBoundsException
.
Я не могу понять, почему, искал похожие решения, но все напрасно. Это мой код:
public boolean add(int index, E elem) {
Node<E> node;
node = new Node<>(elem);
Boolean result = false;
if (index > size) {
System.out.println("Index out of bounds");
}
if (index == 0) {
head = node;
node.next = indices.get(index 1);
node.prev = null;
node.next.prev = node;
result = true;
} else if (index == (size - 1)) {
Node<E> node1 = indices.get(index - 1);
tail = node;
node1.next = node;
node.next = null;
node.prev = node1;
result = true;
} else if (index > 0 amp;amp; index < (size - 1)) {
Node<E> node1;
Node<E> node2;
node1 = indices.get(index - 1);
node2 = indices.get(index);
node.next = node1;
node.prev = node2;
node1.next = node;
node2.prev = node;
result = true;
}
indices.add(index, node);
size ;
System.out.println("Element " elem " added at the index: " index);
System.out.println("The size of the list now is: " size);
return resu<
}
Это поля класса
`идентификатор открытого класса {
private class Node<E>{
E Data;
Node<E> next;
Node<E> prev;
Node(E elem){
this.Data = elem;
this.next = null;
this.prev = null;
}
Node (E elem, Node<E> prev, Node<E> next){
this.Data = elem;
this.prev = prev;
this.next = next;
}
}
Node<E> head;
Node<E> tail;
int size;
ArrayList<Node<E>> indices;`
Это функция get:
`public E get(int index){
Node<E> node;
node = indices.get(index);
E value;
value = node.Data;
System.out.println("Value at index " index " is " value);
return value;
}`
Комментарии:
1. Пожалуйста, добавьте stacktrace из этого исключения.
2. Если индекс слишком велик, выводится сообщение об ошибке, но вы все равно продолжаете выполнение метода. Вместо этого это должно вызвать исключение, чтобы сигнализировать вызывающему, что он допустил ошибку, и остановить выполнение метода.
3.
a.add(1,5); a.add(2,10); a.add(3,15);
— после этого мы возвращаем размер списка,a.add(5,6);
после того, как выполняетсяadd
сноваIndexOutOfBoundsException
.4. @VSoni, ты можешь опубликовать поля своего класса тоже? Трудно предсказать, что находится в вашем классе.
5. @VSoni, прочитайте мои комментарии в ответе, кажется, что существует неправильная логика добавления.
Ответ №1:
Посмотрите на свое условие, оно должно быть index >= size
потому что индексы начинаются с нуля.
public boolean add (int index, E elem) {
Node<E> node = new Node<>(elem); // You don't need to split definition and initialization
if(index >= size) {
System.out.println("Index out of bounds");
return false;
}
if (index == 0) {
head = node;
node.next = indices.get(1); // Why is the next the second item, not the first? Maybe `indices.get(0)`?
node.prev = null;
node.next.prev = node;
} else if (index == (size - 1)) {
Node<E> node1 = indices.get(index - 1);
tail = node;
node1.next = node;
node.next = null;
node.prev = node1;
} else if (index > 0 amp;amp; index < (size - 1)) {
Node<E> node1 = indices.get(index - 1);
Node<E> node2 = indices.get(index);
node.next = node1; // Why is `node1`, not `node2`?
node.prev = node2; // Vice versa
node1.next = node;
node2.prev = node;
} else {
return false;
}
// If result is `false` why do u to add your node?
indices.add(index, node);
size;
System.out.println("Element " elem " added at the index: " index);
System.out.println("The size of the list now is: " size);
return true;
}