我的OOP课程项目遇到了问题。我差不多完成了,但仍缺少toString方法和主要方法。不确定如何去做,并希望得到任何帮助。
我希望我的toString
方法的功能如下:
返回列表中存储的所有项的字符串表示形式。空列表的字符串表示形式类似于
head--><--tail
非空列表的字符串表示形式如下:head-->134<-->-8<-->42<-->1<--tail
public class IntegerNode{
private IntegerNode next;
private IntegerNode prev;
private int data;
public IntegerNode(int data){
next = next;
prev = prev;
data = data;
}
public int getData(){
data = data;
return this.data;
}
public IntegerNode getNext(){
return next;
}
public IntegerNode getPrevious(){
return prev;
}
public void setNext(IntegerNode in){
prev = in;
}
public void setPrevious(IntegerNode in){
prev = in;
}
}
这是我目前在IntegerLinkedList类
中的内容public class IntegerLinkedList{
private IntegerNode head;
private IntegerNode tail;
public IntegerLinkedList(){
head = null;
tail = null;
}
public void addFirst(int x){
IntegerNode nH = new IntegerNode(x);
if (head == null) {
head = nH;
tail = nH;
}else{
head.setPrevious(nH);
nH.setNext(head);
head = nH;
}
}
public void addLast(int x){
IntegerNode t = new IntegerNode(x);
if (tail == null){
head = t;
tail = t;
}else{
tail.setNext(t);
t.setPrevious(tail);
tail = t;
}
}
public int peekFirst(){
return head.getData();
}
public int peekLast(){
return tail.getData();
}
public String toString(){
if (head == null && tail == null){
String empty = "head--><--tail";
return empty;
}else{
String h = "Head--> " + head;
String t = tail + " <--Tail";
String m = " <--> ";
// while(IntegerNode.getNext() != null)
//}
//return h + m + t;
}
}
public int pollFirst(){
int x = head.getData();
head = head.getNext();
head.setPrevious(null);
return x;
}
public int pollLast(){
int x = tail.getData();
tail = tail.getPrevious();
tail.setNext(null);
return x;
}
}
我想一会儿循环就是去这里的方式,但是我又不确定了。
答案 0 :(得分:5)
以下是编写它的方法:
@Override // <-- Annotate that you are overriding the toString() method
public String toString(){
if (head == null && tail == null){
String empty = "head--><--tail";
return empty;
}else{
StringBuilder sb = new StringBuilder();
sb.append("Head-->");
IntegerNode curr = head;
sb.append(curr.getData());
curr = curr.getNext();
while(curr != null) {
sb.append("<-->");
sb.append(curr.getData());
curr = curr.getNext();
}
sb.append("<--tail");
return sb.toString();
}
}
作为替代方案,您可以将逻辑简化为不具有外部if else:
@Override // <-- Annotate that you are overriding the toString() method
public String toString(){
StringBuilder sb = new StringBuilder();
sb.append("Head-->");
IntegerNode curr = head;
if (curr == null)
{
sb.append("<--tail");
return sb.toString();
}
sb.append(curr.getData());
curr = curr.getNext();
while(curr != null) {
sb.append("<-->");
sb.append(curr.getData());
curr = curr.getNext();
}
sb.append("<--tail");
return sb.toString();
}
答案 1 :(得分:2)
是的,你必须使用循环,因为你想迭代未知长度的数据。迈克尔Markidis比我更快地写了答案,使用他的解决方案,但我会建议你的代码有一些改进。
String h = "Head--> " + head;
无法正常工作,因为head是一个对象IntegerNode
,并且您希望像head.getData()
那样访问其数据(同时为什么要指定data = data;
在这个方法中?它应该只返回)
如果要在构造函数中分配与字段同名的数据,请使用this
关键字来明确要分配的内容。同时指定null next
和prev
没有任何意义,因此此代码
public IntegerNode(int data){
next = next;
prev = prev;
data = data;
}
应该是这样的
public IntegerNode(int data){
this.data = data;
}
或者如果要分配上一个和下一个节点
public IntegerNode(int data, IntegerNode next, IntegerNode prev){
this.next = next;
this.prev = prev;
this.data = data;
}
答案 2 :(得分:1)
如果您使用的是Java 8+,StringJoiner
可以轻松实现。
@Override
public String toString() {
StringJoiner joiner = new StringJoiner("<-->", "head-->", "<--tail");
for (IntegerNode node = this.head; node != null; node = node.getNext())
joiner.add(String.valueOf(node.getData()));
return joiner.toString();
}
如果不使用Java 8,StringBuilder
是正确的方法
(执行比直接使用String
更好)
@Override
public String toString() {
StringBuilder buf = new StringBuilder("head-->");
boolean sep = false;
for (IntegerNode node = this.head; node != null; node = node.getNext()) {
if (sep)
buf.append("<-->");
buf.append(node.getData());
sep = true;
}
return buf.append("<--tail").toString();
}
在这两种情况下,您都使用带有node
变量的basic for
loop来遍历列表。
至于你的其余代码,你有一些问题。
public IntegerNode(int data){ next = next; prev = prev; data = data; }
将next
分配给next
和prev
分配给prev
毫无意义。
将参数分配给字段仅在您使用this.
限定字段时才有效,否则您将参数分配给自身(无意义)。
public IntegerNode(int data){
this.data = data;
}
public int getData(){ data = data; return this.data; }
将data
分配给data
毫无意义。
public int getData(){
return this.data;
}
public void setNext(IntegerNode in){ prev = in; }
复制/粘贴错误。您打算分配给next
。
public void setNext(IntegerNode in){
next = in;
}
public int pollFirst(){ int x = head.getData(); head = head.getNext(); head.setPrevious(null); return x; } public int pollLast(){ int x = tail.getData(); tail = tail.getPrevious(); tail.setNext(null); return x; }
当您从列表中轮询最后一个 1 值时,这些方法将抛出NullPointerException
。
添加缺少的if
语句。
public int pollFirst(){
int x = head.getData();
head = head.getNext();
if (head == null)
tail = null;
else
head.setPrevious(null);
return x;
}
public int pollLast(){
int x = tail.getData();
tail = tail.getPrevious();
if (tail == null)
head = null;
else
tail.setNext(null);
return x;
}
1)“last”指的是“唯一剩余的”值,而不是“尾部”值。