如何在 java 中创建一个带有泛型类型节点的 get 方法
How to create a get Method with nodes off a generic type in java
我正在实现循环 DoublyLinkedList 数据结构。与单向链表一样,双向链表中的节点具有对下一个节点的引用,但与单向链表不同的是,双向链表中的节点也具有对前一个节点的引用。
此外,因为列表是"cyclic",所以列表最后一个节点中的"next"引用指向列表中的第一个节点,而第一个节点中的"prev"引用列表中的第一个节点指向列表中的最后一个节点。
我需要帮助来启动我的 get 方法,我一直在四处寻找但找不到任何可以帮助我的东西,因为我正在使用 Generic Type 。我需要 return E 和所有其他示例以 int 为例向我展示它。这是我的代码:
public class DoublyLinkedList<E>
{
private Node first;
private int size;
@SuppressWarnings("unchecked")
public void add(E value)
{
if (first == null)
{
first = new Node(value, null, null);
first.next = first;
first.prev = first;
}
else
{
first.prev.next = new Node(value, first, first.prev);
first.prev = first.prev.next;
}
size++;
}
private class Node<E>
{
private E data;
private Node next;
private Node prev;
public Node(E data, Node next, Node prev)
{
this.data = data;
this.next = next;
this.prev = prev;
}
}
@SuppressWarnings("unchecked")
public void add(int index, E value)
{
if (first.data == null)
{
throw new IndexOutOfBoundsException();
} else if (index == 0)
{
first = new Node(value, first.next, first.prev);
}
else
{
Node current = first;
for (int i = 0; i < index - 1; i++)
{
current = current.next;
}
current.next = new Node(value, current.next, current.prev);
}
}
@SuppressWarnings("unchecked")
public void remove(int index)
{
if (first.data == null)
{
throw new IndexOutOfBoundsException();
}
else if (index == 0)
{
first = first.next;
}
else
{
Node current = first.next;
for (int i = 0; i < index - 1; i++)
{
current = current.next;
}
current.next = current.next.next;
}
size--;
}
我想不出开始这个的方法,但基本上这个方法应该做的是 return 列表中指定索引处的元素。如果索引参数无效,则应抛出 IndexOutOfBoundsException。
public E get(int index)
{
}
另外,我的 remove 方法不准确,但我会自己解决这个问题,我只需要有关 get 方法的帮助。
我明白了,我很震惊,我没有收到这个问题的任何回复。无论哪种方式,我都会写一些评论,以便为未来正在为此苦苦挣扎的观众提供一些指导。
@SuppressWarnings("unchecked")
public E get(int index)
{
if(index < 0) //The index needs to be above 0.
{
throw new IndexOutOfBoundsException();
}
if(index > size) //Since we're going to run a for loop, we need to make sure the index doesn't go past the size of the list.
{
throw new IndexOutOfBoundsException();
}
Node current = first; //We want to create another node to perform this method.
for (int i = 0; i < index; i++) //We are going to set i to 0 and loop around this for loop until we reach the index.
{
current = current.next;
}
return (E) current.data; //Since we are working with generics, we need to return a type E, and it needs to be in parenthesis so it gets that object.
}
我遇到的另一个问题是,在我的 Node Class 中,我可以在没有它的情况下继续前进。让我们将其更新为
private class Node
{
private E data;
private Node next;
private Node prev;
public Node(E data, Node next, Node prev)
{
this.data = data;
this.next = next;
this.prev = prev;
}
}
现在我的 getMethod() 将如下所示:
@SuppressWarnings("unchecked")
public E get(int index)
{
if(index < 0)
{
throw new IndexOutOfBoundsException();
}
if(index > size)
{
throw new IndexOutOfBoundsException();
}
Node current = first;
for (int i = 0; i < index; i++)
{
current = current.next;
}
return current.data;
}
也可以使用hash map,获取常数时间的数据
public T get(int position){
Node<T> node = map.get(position);
T dat = node.getData();
return dat;
}
我正在实现循环 DoublyLinkedList 数据结构。与单向链表一样,双向链表中的节点具有对下一个节点的引用,但与单向链表不同的是,双向链表中的节点也具有对前一个节点的引用。
此外,因为列表是"cyclic",所以列表最后一个节点中的"next"引用指向列表中的第一个节点,而第一个节点中的"prev"引用列表中的第一个节点指向列表中的最后一个节点。
我需要帮助来启动我的 get 方法,我一直在四处寻找但找不到任何可以帮助我的东西,因为我正在使用 Generic Type 。我需要 return E 和所有其他示例以 int 为例向我展示它。这是我的代码:
public class DoublyLinkedList<E>
{
private Node first;
private int size;
@SuppressWarnings("unchecked")
public void add(E value)
{
if (first == null)
{
first = new Node(value, null, null);
first.next = first;
first.prev = first;
}
else
{
first.prev.next = new Node(value, first, first.prev);
first.prev = first.prev.next;
}
size++;
}
private class Node<E>
{
private E data;
private Node next;
private Node prev;
public Node(E data, Node next, Node prev)
{
this.data = data;
this.next = next;
this.prev = prev;
}
}
@SuppressWarnings("unchecked")
public void add(int index, E value)
{
if (first.data == null)
{
throw new IndexOutOfBoundsException();
} else if (index == 0)
{
first = new Node(value, first.next, first.prev);
}
else
{
Node current = first;
for (int i = 0; i < index - 1; i++)
{
current = current.next;
}
current.next = new Node(value, current.next, current.prev);
}
}
@SuppressWarnings("unchecked")
public void remove(int index)
{
if (first.data == null)
{
throw new IndexOutOfBoundsException();
}
else if (index == 0)
{
first = first.next;
}
else
{
Node current = first.next;
for (int i = 0; i < index - 1; i++)
{
current = current.next;
}
current.next = current.next.next;
}
size--;
}
我想不出开始这个的方法,但基本上这个方法应该做的是 return 列表中指定索引处的元素。如果索引参数无效,则应抛出 IndexOutOfBoundsException。
public E get(int index)
{
}
另外,我的 remove 方法不准确,但我会自己解决这个问题,我只需要有关 get 方法的帮助。
我明白了,我很震惊,我没有收到这个问题的任何回复。无论哪种方式,我都会写一些评论,以便为未来正在为此苦苦挣扎的观众提供一些指导。
@SuppressWarnings("unchecked")
public E get(int index)
{
if(index < 0) //The index needs to be above 0.
{
throw new IndexOutOfBoundsException();
}
if(index > size) //Since we're going to run a for loop, we need to make sure the index doesn't go past the size of the list.
{
throw new IndexOutOfBoundsException();
}
Node current = first; //We want to create another node to perform this method.
for (int i = 0; i < index; i++) //We are going to set i to 0 and loop around this for loop until we reach the index.
{
current = current.next;
}
return (E) current.data; //Since we are working with generics, we need to return a type E, and it needs to be in parenthesis so it gets that object.
}
我遇到的另一个问题是,在我的 Node Class 中,我可以在没有它的情况下继续前进。让我们将其更新为
private class Node
{
private E data;
private Node next;
private Node prev;
public Node(E data, Node next, Node prev)
{
this.data = data;
this.next = next;
this.prev = prev;
}
}
现在我的 getMethod() 将如下所示:
@SuppressWarnings("unchecked")
public E get(int index)
{
if(index < 0)
{
throw new IndexOutOfBoundsException();
}
if(index > size)
{
throw new IndexOutOfBoundsException();
}
Node current = first;
for (int i = 0; i < index; i++)
{
current = current.next;
}
return current.data;
}
也可以使用hash map,获取常数时间的数据
public T get(int position){
Node<T> node = map.get(position);
T dat = node.getData();
return dat;
}