我在处理 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;
}
}
我在想一段时间循环是去这里的方式,但话又说回来,我不确定。
这是怎么写的:
@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();
}
}
作为替代方法,您可以简化逻辑,使其没有外部(如果不是):
@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();
}
是的,您必须使用循环,因为您想要迭代未知长度的数据。迈克尔·马基迪斯写出答案的速度比我快,使用他的解决方案,但是我建议对你的代码进行一些改进。
String h = "Head--> " + head;
不起作用,因为 head 是一个对象IntegerNode
,并且您想像这样head.getData()
访问其数据(还有为什么要在此方法中分配data = data;
?它应该只返回)
如果要在构造函数中分配与字段同名的数据,请使用 必须使用this
关键字来明确要分配的内容。此外,分配 nullnext
和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;
}
如果您使用的是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
变量的基本for
循环来循环访问列表。
至于你的其余代码,你有一些问题。
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)"最后"是指"仅剩"的值,而不是"尾部"值。