通过char Stack创建一个char并将其分配给标签。JavaFX

罗宾·斯文森

好吧,我已经尝试了很长时间了,以使这项工作生效。我下面的代码非常凌乱,无法正常运行atm,主要是为了展示我之前的尝试。

我需要什么帮助?我想创建一个Stack对象,该对象从文本字段中逐个字符读取(推送)一个字符,然后弹出并反向打印单词。应该自动考虑堆栈是后进先出(LIFO)。

 charStack stack = new charStack();
    String entering = textfield.getText();
    for(int i = 0; i < entering.length(); i++){
        //stack.push(i);
        char ch = entering.charAt(i);
        if(Character.isHighSurrogate(ch)){
          i++;
        if (i < entering.length()){
          stack.push(entering.charAt(i));
        }
        }
        stack.push(ch);
        while(entering.length() != 0){
        label.setText(stack.pop().toString());
    }
}

控制器:

public class FXMLDocumentController implements Initializable {

    @FXML
    private Label label;

    @FXML
    private TextField textfield;

    Stack<Character> stack = new Stack<>();

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        //label.textProperty().bind(textfield.textProperty());



    }    

    @FXML
    private void exeCute(ActionEvent event) {
       // String a = textfield.getText();
        //for (char c: a.toCharArray()){
          //  stack.push(c);

        //}

        //while(!stack.empty()){
          //  label.setText(stack.pop().toString());
        //}

        //char[] stack = textfield.getText().toCharArray();
        //char[] reverse = new char[stack.length];
        //int position = stack.length - 1;
        //for(int i = 0; i<stack.length; i++){
          //  reverse[i] = stack[position--];
        //}
        //System.out.print(reverse);
        //String newone = reverse.toString();
        //label.setText(newone); //Works (sort of) but need to do this with stack-object

        //String entering = textfield.getText();
        //for (int i = 0; i < entering.length(); i++){
          //  char ch = entering.charAt(i);
            //if(Character.isHighSurrogate(ch)){
              //  i++;
                //if (i < entering.length()){
                  //  stack.push(entering.charAt(i));
                //}
            //}
            //stack.push(ch);
            //System.out.print(stack.pop());  

        String e = textfield.getText();
            for (int i = 0; i < e.length(); i++){
            char ch = e.charAt(i);
            if(Character.isHighSurrogate(ch)){
                i++;
                if (i < e.length()){
                    stack.push(e.charAt(i));

                }
            }
            stack.push(ch);
            //stack.pop();
            //printStack(stack);


            }
    }
    private void printStack(Stack<Character> s){
        if (s.isEmpty()){
            System.out.println("Stack is empty!");
        }
        else {
            System.out.printf("%s TOP\n" + s);
        }
    }
}
宝石海

我建议不要编写自己的逐个字符的字符串反转逻辑。由于使用了用于对Java字符串进行字符编码的unicode系统,因此这样做涉及的逻辑有些棘手,因为它需要考虑unicode代理对(并且您的实现可能会出错)。

相反,请重用JDK库中现有的反转逻辑:StringBuilder :: reverse绑定可用于使标签文本与反向字符串保持同步。

label.textProperty().bind(
        Bindings.createStringBinding(
                () -> new StringBuilder(textField.getText()).reverse().toString(),
                textField.textProperty()
        )
);

在此示例中,每次文本字段的文本更改时,都会完全构建反向字符串。这不是最有效的编码方式。但是,考虑到TextField中期望的字符串长度很小,因此不希望解决方案的效率会导致任何类型的性能问题。

样本图片

示例应用

import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class InputReversal extends Application {    
    @Override
    public void start(Stage stage) {
        TextField textField = new TextField();
        Label label = new Label();
        label.textProperty().bind(
                Bindings.createStringBinding(
                        () -> new StringBuilder(textField.getText()).reverse().toString(),
                        textField.textProperty()
                )
        );

        VBox layout = new VBox(10, textField, label);
        layout.setPadding(new Insets(10));
        stage.setScene(new Scene(layout));
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

哦,我们的老师希望我们尝试不同类型的高级编程,例如this ..,以便更好地理解不同的数据结构和javafx接口。

一个简单的基于堆栈的解决方案是:

private String reverse(String text) {
    final Stack<Character> stack = new Stack<>();
    for (int i = 0; i < text.length(); i++) {
        stack.push(text.charAt(i));
    }

    StringBuilder builder = new StringBuilder(text.length());
    for (int i = 0; i < text.length(); i++) {
        builder.append(stack.pop());
    }

    return builder.toString();
}

通过以下方式调用:

Bindings.createStringBinding(
        () -> reverse(textField.getText()),
        textField.textProperty()
)

但是,这并未考虑需要代理对逻辑的逆转。由于这似乎是一项任务,因此我将把这部分留给您。为此,尽管可能会使您感到困惑,但咨询内置JavaFX库源如何处理字符串反转可能有助于确定正确的逻辑。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

go-无法通过仅将一个变量分配给另一个变量来创建map [int]类型的变量的副本

在C中,无法释放并将NULL分配给char指针

通过char将char分配给c ++字符串

如何将另一个列表分配给“通过引用传递”的列表?

将char *数组中的字符串分配给另一个char *数组

如何在C中将一个char数组的整个值分配给十六进制格式的一个位置的另一个数组?

将const char *分配给char *

将内存分配给const char ***变量时出现错误“ realloc():下一个大小无效”

在C中将char数组分配给char数组

我有一个for循环,将字符分配给char数组,错误:System.IndexOutOfRangeException

将const char *分配给const char **后,我遇到了一个错误

通过值传递char数组

通过传递char的scanf

通过TCP的struct char *

将Unicode字符分配给char

如何(通过CLI)将多个IP地址分配给一个接口?

将const char数组分配给char数组

通过stringstream将数字分配给char *

分配一个char数组

分配一个char指针数组

将字符串文字的第一个字符分配给char数组将分配整个字符串文字

如何将一个char中的值分配给一个指针?

将int值分配给char

将内存分配给char **

通过代码创建材料并将其分配给对象

如何将char的值分配给char的整数?

将 char* 写入 basic_streambuf 并将其分配给 ifstream

如何通过 BASH 主机命令一个变量并将答案分配给另一个变量

使用 char 将一个 char 数组分配给另一个 char 数组时的奇怪行为