BST(二叉搜索树)中的String toString方法
String toString method in BST (binary search tree)
为什么下一个方法不打印任何内容,但是当我将 String s 更改为 array 时,它可以正常工作?
不工作:
public String toString(){
//In-Order - left,root,right.
String s ="";
toString(root,s);
return s;
}
public void toString(BSTNode root,String s){
if (root!=null){
toString(root.left,s);
s=s+","+ root.data;
toString(root.right,s);
}
}
工作:
public String toString(){
//In-Order - left,root,right.
String[] s =new String[1];
s[0]="";
toString(root,s);
return s[0];
}
public void toString(BSTNode root,String[] s){
if (root!=null){
toString(root.left,s);
s[0]=s[0]+","+ root.data;
toString(root.right,s);
}
java 中的字符串是不可变的,这意味着每次您为它们分配一个新值时,实际上都会创建一个新对象并且引用会发生变化。
原因是,String 不是普通的 Reference-Type。如果您更改一个字符串,则会生成一个新字符串并返回修改后的字符串(字符串是不可变的)。 (参见 String.replace() 示例)
如果您将方法更改为如下所示,它应该可以工作:
public String toString(){
//In-Order - left,root,right.
return toString(root,s);
}
public String toString(BSTNode root,String s){
if (root!=null){
return toString(root.right,toString(root.left,s)+","+root.data);
}
return "";
}
当你创建一个 String 数组并传递时,基本上它是在创建 String 对象(就像我们使用 new operator
创建的一样)。因此,它会在您处理它时起诉相同的引用并修改 String 。但在前一种情况下,它将它们视为两个单独的变量,就像在 java.
中处理原始类型一样
public class StringTest {
public static void main(String[] args) {
String s[] = new String[1];
System.out.println("before: "+s[0]);
updateString(s);
System.out.println("after: " + s[0]);
}
private static void updateString(String s[]) {
s[0] = "New String";
}
}
程序的输出是:
before: null
after: New String
否则,它不打印任何东西。
为什么下一个方法不打印任何内容,但是当我将 String s 更改为 array 时,它可以正常工作?
不工作:
public String toString(){
//In-Order - left,root,right.
String s ="";
toString(root,s);
return s;
}
public void toString(BSTNode root,String s){
if (root!=null){
toString(root.left,s);
s=s+","+ root.data;
toString(root.right,s);
}
}
工作:
public String toString(){
//In-Order - left,root,right.
String[] s =new String[1];
s[0]="";
toString(root,s);
return s[0];
}
public void toString(BSTNode root,String[] s){
if (root!=null){
toString(root.left,s);
s[0]=s[0]+","+ root.data;
toString(root.right,s);
}
java 中的字符串是不可变的,这意味着每次您为它们分配一个新值时,实际上都会创建一个新对象并且引用会发生变化。
原因是,String 不是普通的 Reference-Type。如果您更改一个字符串,则会生成一个新字符串并返回修改后的字符串(字符串是不可变的)。 (参见 String.replace() 示例) 如果您将方法更改为如下所示,它应该可以工作:
public String toString(){
//In-Order - left,root,right.
return toString(root,s);
}
public String toString(BSTNode root,String s){
if (root!=null){
return toString(root.right,toString(root.left,s)+","+root.data);
}
return "";
}
当你创建一个 String 数组并传递时,基本上它是在创建 String 对象(就像我们使用 new operator
创建的一样)。因此,它会在您处理它时起诉相同的引用并修改 String 。但在前一种情况下,它将它们视为两个单独的变量,就像在 java.
public class StringTest {
public static void main(String[] args) {
String s[] = new String[1];
System.out.println("before: "+s[0]);
updateString(s);
System.out.println("after: " + s[0]);
}
private static void updateString(String s[]) {
s[0] = "New String";
}
}
程序的输出是:
before: null
after: New String
否则,它不打印任何东西。