Java:将 InOrder Traversal 作为字符串返回给 JLabel
Java: Returning InOrder Traversal as String to JLabel
正在尝试 return InOrder 遍历的输出到 Java JLabel。我能够 return ArrayList 的内容,但需要输出为不带 [] 的字符串。我确信这是一个简单的解决方案,但我已经尝试了一段时间不同的东西,基本上是追着我的尾巴。非常感谢提供的任何帮助。
GUI 部分:
将来自文本字段的输入存储为 String originalList。尝试使用 getResult() 的输出设置 JLabel "resultBox" 的文本。
if (e.getSource() == sortBtn) {
System.out.println("Test");
String originalList = readN();
resultBox.setText(getResult(originalList));
System.out.println("Original List: " + originalList);
}
getResult() 标记化 originalList 并插入到 BinarySearchTree 'tree' 和 returns 中序遍历 'tree.inOrder()'
public static String getResult(String tokenString) {
StringTokenizer tokens = new StringTokenizer(tokenString, "()*/+- ", false);
while (tokens.hasMoreTokens()) {
String tkn = tokens.nextToken();
if(tkn.equals(" ")) {
//ignore spaces
}
else {
int key = Integer.parseInt(tkn);
tree.insert(key);
}
}
return tree.inorder();
}
inorder() 调用 inorderRec() 和 returns 结果。
// This method mainly calls inorderRec()
String inorder() {
String result = inorderRec(root);
return result;
}
// A utility function to do inorder traversal of BST
String inorderRec(Node root) {
if (root != null) {
inorderRec(root.left);
keyList.add(root.key);
inorderRec(root.right);
}
return String.valueOf(keyList);
//return result;
}
如果使用输入 50 30 20 40 70 60 80,JLabel 的结果应该是 20 30 40 50 60 70 80,但实际输出是 [20, 30, 40, 50, 60 ,70 ,80]
String.valueOf(keyList)
调用列表的 toString
- 因此您将以表示形式结束。
而是在 inorderRec
方法 return 之后以所需格式构造输出。为此,我看到没有必要 return 来自 inorderRec
的任何东西,因为你正在添加到 some 列表(keyList
)(你没有'显示它的创建位置)
String inorder() {
inorderRec(root);
return String.join(" ", ketList);
}
void inorderRec(Node root) {
if (root != null) {
inorderRec(root.left);
keyList.add(root.key);
inorderRec(root.right);
}
}
String.join
的 javadoc 状态
Returns a new {@code String} composed of copies of the {@code CharSequence elements} joined together with a copy of the specified {@code delimiter}.
如果您使用的是 Java 8 或更高版本,您可以使用 String.join()
API (https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#join-java.lang.CharSequence-java.lang.Iterable-) 将列表的所有元素连接成一个具有给定分隔符的单个字符串。例如:
List<String> names = Arrays.asList("Mark", "Stacy", "Gretta");
System.out.println(String.join(" ", names));
会输出:
Mark Stacy Gretta
我明白了。我薄 user7 给了我一个线索 "construct the output in the desired format after the inorderRec method returns." 我最初在 inorderRec() 中迭代了 keyList 但只会输出一个索引,很可能是因为循环中的语句是:
结果 = String.valueOf(keyList.get(i) + " ");
而不是
结果 += String.valueOf(keyList.get(i) + " ");
我将其移至 inorder() 并且一切都正确输出。非常感谢你们俩的帮助。非常感谢!
更新后的代码输出正确:
// This method mainly calls InorderRec()
String inorder() {
//String result = inorderRec(root);
inorderRec(root);
for (int i = 0; i < keyList.size(); i++) {
//System.out.print(keyList.get(i) + " ");
result += String.valueOf(keyList.get(i) + " ");
}
return result;
}
// A utility function to do inorder traversal of BST
void inorderRec(Node root) {
if (root != null) {
inorderRec(root.left);
keyList.add(root.key);
inorderRec(root.right);
}
}
GUI output
正在尝试 return InOrder 遍历的输出到 Java JLabel。我能够 return ArrayList 的内容,但需要输出为不带 [] 的字符串。我确信这是一个简单的解决方案,但我已经尝试了一段时间不同的东西,基本上是追着我的尾巴。非常感谢提供的任何帮助。
GUI 部分: 将来自文本字段的输入存储为 String originalList。尝试使用 getResult() 的输出设置 JLabel "resultBox" 的文本。
if (e.getSource() == sortBtn) {
System.out.println("Test");
String originalList = readN();
resultBox.setText(getResult(originalList));
System.out.println("Original List: " + originalList);
}
getResult() 标记化 originalList 并插入到 BinarySearchTree 'tree' 和 returns 中序遍历 'tree.inOrder()'
public static String getResult(String tokenString) {
StringTokenizer tokens = new StringTokenizer(tokenString, "()*/+- ", false);
while (tokens.hasMoreTokens()) {
String tkn = tokens.nextToken();
if(tkn.equals(" ")) {
//ignore spaces
}
else {
int key = Integer.parseInt(tkn);
tree.insert(key);
}
}
return tree.inorder();
}
inorder() 调用 inorderRec() 和 returns 结果。
// This method mainly calls inorderRec()
String inorder() {
String result = inorderRec(root);
return result;
}
// A utility function to do inorder traversal of BST
String inorderRec(Node root) {
if (root != null) {
inorderRec(root.left);
keyList.add(root.key);
inorderRec(root.right);
}
return String.valueOf(keyList);
//return result;
}
如果使用输入 50 30 20 40 70 60 80,JLabel 的结果应该是 20 30 40 50 60 70 80,但实际输出是 [20, 30, 40, 50, 60 ,70 ,80]
String.valueOf(keyList)
调用列表的 toString
- 因此您将以表示形式结束。
而是在 inorderRec
方法 return 之后以所需格式构造输出。为此,我看到没有必要 return 来自 inorderRec
的任何东西,因为你正在添加到 some 列表(keyList
)(你没有'显示它的创建位置)
String inorder() {
inorderRec(root);
return String.join(" ", ketList);
}
void inorderRec(Node root) {
if (root != null) {
inorderRec(root.left);
keyList.add(root.key);
inorderRec(root.right);
}
}
String.join
的 javadoc 状态
Returns a new {@code String} composed of copies of the {@code CharSequence elements} joined together with a copy of the specified {@code delimiter}.
如果您使用的是 Java 8 或更高版本,您可以使用 String.join()
API (https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#join-java.lang.CharSequence-java.lang.Iterable-) 将列表的所有元素连接成一个具有给定分隔符的单个字符串。例如:
List<String> names = Arrays.asList("Mark", "Stacy", "Gretta");
System.out.println(String.join(" ", names));
会输出:
Mark Stacy Gretta
我明白了。我薄 user7 给了我一个线索 "construct the output in the desired format after the inorderRec method returns." 我最初在 inorderRec() 中迭代了 keyList 但只会输出一个索引,很可能是因为循环中的语句是:
结果 = String.valueOf(keyList.get(i) + " ");
而不是
结果 += String.valueOf(keyList.get(i) + " ");
我将其移至 inorder() 并且一切都正确输出。非常感谢你们俩的帮助。非常感谢!
更新后的代码输出正确:
// This method mainly calls InorderRec()
String inorder() {
//String result = inorderRec(root);
inorderRec(root);
for (int i = 0; i < keyList.size(); i++) {
//System.out.print(keyList.get(i) + " ");
result += String.valueOf(keyList.get(i) + " ");
}
return result;
}
// A utility function to do inorder traversal of BST
void inorderRec(Node root) {
if (root != null) {
inorderRec(root.left);
keyList.add(root.key);
inorderRec(root.right);
}
}
GUI output