我是CS专业的第一年,我想知道你是否可以帮我清理我的MyStringBuilder类中的append(StringBuilder b)方法。我在最后一次尝试在我的测试驱动程序中链接列表之间来回追踪问题。我在这之前的每一步插入调试打印语句,它似乎工作正常......每个字符串构建器对象应该仍然存在彼此独立。谢谢!
//SAMPLE OUTPUT (what its supposed to be)
**Testing constructor methods
this is a string
another string
Testing Append methods
this is a string another string
this is a string another string and another
this is a string another string and another another string
this is a string another string and another another string!!
another string different strings?
...appending data**
//MY CURRENT OUTPUT
**Testing constructor methods
this is a string
another string
Testing Append methods
this is a string another string
this is a string another string and another
this is a string another string and another another string
this is a string another string different strings?
another string different strings?
...appending data**
MY STRING BUILDER CLASS THUS FAR
public class MyStringBuilder
{
private CNode firstC; //first character node
private CNode lastC; //last character node
private int length; //length of mystringbuilder object
public MyStringBuilder(String s) //this one should is correct since it was given!
{
if (s == null || s.length() == 0) // Special case for empty String
{ // or null reference
firstC = null;
lastC = null;
length = 0;
}
else
{
// Create front node to get started
firstC = new CNode(s.charAt(0));
length = 1;
CNode currNode = firstC;
// Create remaining nodes, copying from String. Note
// how each new node is simply added to the end of the
// previous one. Trace this to see what is going on.
for (int i = 1; i < s.length(); i++)
{
CNode newNode = new CNode(s.charAt(i));
currNode.next = newNode;
currNode = newNode;
length++;
}
lastC = currNode;
}
}
// Create a new MyStringBuilder initialized with the chars in array s
public MyStringBuilder(char [] s)
{
if (s == null || s.length == 0) // Special case for empty char array
{ // or null reference
firstC = null;
lastC = null;
length = 0;
}
else
{
// Create front node to get started
firstC = new CNode(s[0]);
length = 1;
CNode currNode = firstC;
// Create remaining nodes, copying from char array.
for (int i = 1; i < s.length; i++)
{
CNode newNode = new CNode(s[i]);
currNode.next = newNode;
currNode = newNode;
length++;
}
lastC = currNode;
}
}
// Create a new empty MyStringBuilder
public MyStringBuilder()
{
firstC=null;
lastC=null;
length=0;
}
// Append MyStringBuilder b to the end of the current MyStringBuilder, and
// return the current MyStringBuilder. Be careful for special cases!
public MyStringBuilder append(MyStringBuilder b)
{
if(length==0)
{
firstC = new CNode(b.firstC.data);
length = 1;
CNode currNode = b.firstC;
for (int i = 1; i < b.length; i++)
{
CNode newNode = new CNode(currNode.next.data);
currNode.next = newNode;
currNode = newNode;
length++;
}
lastC = currNode;
}
else{//works
CNode currNode = lastC;
CNode newNode = b.firstC;
for (int i = 1; i < b.length+1; i++)
{
currNode.next = newNode;
currNode = newNode;
newNode = currNode.next;
length++;
}
lastC = currNode;
}
return b;
}
// Append String s to the end of the current MyStringBuilder, and return
// the current MyStringBuilder. Be careful for special cases!
public MyStringBuilder append(String s)
{
if (s == null ) // Special case for null ref
{
throw new NullPointerException("attempting to add empty string");
}
else // non null ref
{
//convert string argument to temp char array to be passed into nodes
char [] tempCArray = s.toCharArray();
if (isEmpty()) // if stringbuilder is empty
{
// Create front node to get started
firstC = new CNode(tempCArray[0]);
length = 1;
CNode currNode = firstC;
// Create remaining nodes, copying from temp char array.
for (int i = 1; i < tempCArray.length; i++)
{
CNode newNode = new CNode(tempCArray[i]);
currNode.next = newNode;
currNode = newNode;
length++;
lastC = currNode;
}
}
//is stringbuilder is not empty
else {
CNode currNode = lastC;
//if string builder is not empty
// Create nodes, copying from temp char array.
for (int i = 0; i < tempCArray.length; i++) {
CNode newNode = new CNode(tempCArray[i]);
currNode.next = newNode;
currNode = newNode;
length++;
lastC = currNode;
}
}
}
return this;
}
// Append char array c to the end of the current MyStringBuilder, and
// return the current MyStringBuilder. Be careful for special cases!
public MyStringBuilder append(char [] c)
{
if (c == null || c.length == 0) // Special case for empty char array
{ // or null reference
throw new NullPointerException("attempting to add empty character array");
}
else
{
if (isEmpty()) // if stringbuilder is empty
{
// Create front node to get started
firstC = new CNode(c[0]);
length = 1;
CNode currNode = firstC;
// Create remaining nodes, copying from char array.
for (int i = 1; i < c.length; i++)
{
CNode newNode = new CNode(c[i]);
currNode.next = newNode;
currNode = newNode;
length++;
lastC = currNode;
}
}
//is stringbuilder is not empty
else {
CNode currNode = lastC;
//if string builder is not empty
// Create nodes, copying from char array.
for (int i = 0; i < c.length; i++) {
CNode newNode = new CNode(c[i]);
currNode.next = newNode;
currNode = newNode;
length++;
lastC = currNode;
}
}
}
return this;
}
// Append char c to the end of the current MyStringBuilder, and
// return the current MyStringBuilder. Be careful for special cases!
public MyStringBuilder append(char c)
{
CNode newNode = new CNode(c);
if (isEmpty())
{
firstC = newNode;
lastC = newNode;
} //if stringbuilder object is empty
else
{
CNode currNode = lastC;
currNode.next=newNode;
currNode = newNode;
lastC = currNode;
} // if stringbuilder object is not empty
length++;
return this;
}
public String toString() //!!must change to eliminate +!!
{
CNode currNode= firstC;
char [] temp = new char [length];
int counter=0;
if (length == 0)
return "";
while (currNode.next !=null)
{
temp[counter]=currNode.data;
currNode = currNode.next;
counter++;
}
temp[counter]=currNode.data;
String result = new String (temp);
return result;
}
/** additional private methods **/
private boolean isEmpty()
{
if (length<1)
return true;
return false;
} //end of isEmpty
private class CNode
{
private char data;
private CNode next;
public CNode(char c)
{
data = c;
next = null;
}
public CNode(char c, CNode n)
{
data = c;
next = n;
}
} // end of CNode inner class
} //end of MyStringBuilder class
测试驾驶员计划ASSIG2AltTest
public class Assig2AltTest
{
public static void main(String [] args)
{
System.out.println("Testing constructor methods");
MyStringBuilder b1 = new MyStringBuilder("this is a string");
char [] c = {' ','a','n','o','t','h','e','r',' ','s','t','r','i','n','g'};
MyStringBuilder b2 = new MyStringBuilder(c);
MyStringBuilder b3 = new MyStringBuilder();
System.out.println(b1);
System.out.println(b2);
System.out.println(b3); // will show as an empty line
System.out.println("\nTesting Append methods");
b1.append(b2);
System.out.println(b1);
b1.append(" and another");
System.out.println(b1);
b1.append(c);
System.out.println(b1);
b1.append('!'); b1.append('!'); // char append
b2.append(" different strings?");
System.out.println(b1); // Testing for independence of the StringBuilders
System.out.println(b2); // after append. b1 should be unchanged here
// Special case appending to empty object
b3.append("...appending data");
System.out.println(b3);
}
}
答案 0 :(得分:0)
问题在于你的
public MyStringBuilder append(MyStringBuilder b)
课程MyStringBuilder
中的方法
else块错误
} else {// works
CNode currNode = lastC;
CNode newNode = b.firstC;
for (int i = 1; i < b.length + 1; i++) {
currNode.next = newNode;
currNode = newNode;
newNode = currNode.next;
length++;
}
lastC = currNode;
}
此代码执行以下操作 - 此处的节点现在指向b
中的节点。这意味着当您在测试b2
中追加Assig2AltTest
时,您实际上也会修改b1
,因为b1
已开始指向b2
中的节点}。
您应该像这样编辑append(MyStringBuilder b)
方法:
public MyStringBuilder append(MyStringBuilder b) {
if (length == 0) {
firstC = new CNode(b.firstC.data);
length = 1;
CNode currNode = b.firstC;
for (int i = 1; i < b.length; i++) {
CNode newNode = new CNode(currNode.next.data);
currNode.next = newNode;
currNode = newNode;
length++;
}
lastC = currNode;
} else {// works
CNode currNode = lastC;
CNode bNode = b.firstC;
for (int i = 1; i < b.length + 1; i++) {
CNode newNode = new CNode(bNode.data);
currNode.next = newNode;
currNode = newNode;
newNode = currNode.next;
bNode = bNode.next;
length++;
}
lastC = currNode;
}
return b;
}