有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java根据一些规则替换EditText中的字母

我正在创建一个应用程序,这样当用户输入一个单词并按下按钮时,TextView会根据一些规则显示一个新单词。比如,如果单词中有字母“a”,那么就用“.-”(摩尔斯电码)来更改它

示例:输入字:“abba”输出:“.--…”(a=“.-”b=“-…”)

我已经创建了一个演示应用程序,其中只有两条“a”和“b”规则。如果我只输入一个字母,它就可以工作,但如果我输入更像“ab”,它就不能正常工作

Java文件:

public class MainActivity extends AppCompatActivity {

EditText vpis;
TextView rezultat;
Button pretvori;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    vpis = (EditText) findViewById(R.id.tekst);
    rezultat = (TextView) findViewById(R.id.rezultat);
    pretvori = (Button) findViewById(R.id.gumb);


    pretvori.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String morse = vpis.getText().toString();
            for (int i=0; i<morse.length(); i++){
                if(morse.charAt(i) == 'a'){
                    rezultat.setText(".-");
                }else if (morse.charAt(i) == 'b'){
                    rezultat.setText("-...");
                }
            }
        }
    });
}
}

提前谢谢


共 (2) 个答案

  1. # 1 楼答案

    这可以通过字符串替换方法来实现,因为我认为这是最简单的方法,并且不会占用更多的内存。下面是您所拥有的修改后的代码

    public class MainActivity extends AppCompatActivity {
    
    EditText vpis;
    TextView rezultat;
    Button pretvori;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        vpis = (EditText) findViewById(R.id.tekst);
        rezultat = (TextView) findViewById(R.id.rezultat);
        pretvori = (Button) findViewById(R.id.gumb);
    
    
        pretvori.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String morse = vpis.getText().toString();
                String newString = morse.replace("a",".-");
                newString = newString.replace("b","-...");
                rezultat.setText(newString);
            }
        });
    }
    }
    

    如果有很多模式,那么可以将该模式设置为常量数组,并使用字符串替换方法循环该模式

    更正:

    在你的例子中,“abba”应该像这样返回“…-…-…-”

  2. # 2 楼答案

    你有一个错误的逻辑-你总是通过每次使用setText()来覆盖文本,这就是为什么在TextView中只有最后一个值是可见的。您需要附加结果,并在循环结束时,将文本设置为TextView。这样做:

    String morse = vpis.getText().toString();
    String text = "";
            for (int i=0; i<morse.length(); i++){
                if(morse.charAt(i) == 'a'){
                    text+=".-";
                }else if (morse.charAt(i) == 'b'){
                    text+="-...";
                }
         }
    rezultat.setText(text);
    

    如果您想要稍微好一些的性能,考虑使用StringBuilderStringBuffer而不是字符串,因为^ {CD4>}是<强>不可变,并且连接实际上每次都会生成一个新的^ {< CD5>}。 如果使用StringBuilder,它将如下所示:

    StringBuilder sb = new StringBuilder();
    

    您将使用sb.append(whatever)而不是text+= whatever,最后您将使用rezultat.setText(sb.toString());