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