好吧,我已经尝试了很长时间了,以使这项工作生效。我下面的代码非常凌乱,无法正常运行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] 删除。
我来说两句