字符串替换字符串

时间:2014-10-31 14:17:18

标签: java string flags

美好的一天。所以我想问你如何更改我从JEditorPane获得的字符串中的子字符串。

我按照以下方式制作和弦变换程序:C到C#,C#到D,D#到E,E到F,F到F#,F#到G,G到G#,......

我编写了代码,但它总是从乞讨到结束。例如,如果我在JEditorPane中写道:

" C D#E"这一切都归于F#。我怎样才能对1步进行更改(只需C到C#,D#到E,E到F)?

if (event.getSource()== ok)
{
    Object contents = akordib.getSelectedItem();
    if (contents == "+1 step")
    {
        finalStr = textPanel.getText();
        if (finalStr.contains(" C ") == true)
        {
            finalStr = finalStr.replaceAll(" C" , " C#");
            textPanel.setText(finalStr);
        }

        if (finalStr.contains(" C# ") == true)
        {
            finalStr = finalStr.replaceAll(" C# ", " D ");
            textPanel.setText(finalStr);
        }
    }   
}

这是一个例子: 原文:

  

C D#E

代码应该是:

  

C#E F

3 个答案:

答案 0 :(得分:2)

反过来写。它正在发生,因为在测试C#时你已经将C设置为C#。

答案 1 :(得分:1)

您当前的问题是您更换条目的顺序。当你开始

C D# E

并将每个C替换为C#,您的变量将包含

C# D# E

如果您将所有C#替换为D,则您的变量将包含

D D# E

将它们换到另一个方向可以解决它,例如首先将C#替换为D,然后将C替换为C#。

唯一棘手的部分是你需要能够绕过并将H替换为C.解决方案是首先用X替换H(或任何其他不发生的角色),做所有其他替换按照正确的顺序和最后一步再次用C替换X.

答案 2 :(得分:0)

首先,您可能不应该使用final作为变量的名称,因为final是Java中的关键字。

其次,您应该将字符串拆分到一个空格上,然后在该数组中循环,将每个音符拉出半步。

String notes = textPanel.getText();
String[] notesArr = notes.split(" ");
StringBuilder newNotes = new StringBuilder();
for(int i=0; i < notesArr.length; i++) {
    String newNote = moveHalfStep(notesArr[i]);
    newNotes.append(newNote);
    newNotes.append(" ");
}
textPanel.setText(newNotes.toString());

private String moveHalfStep(String note) {
    String newNote = "";
    if(note.contains("#")) {
        char[] noteChars = note.toCharArray();
        char noteChar = noteChars[0];
        noteChar++;
        if(noteChar == 'H') {
            noteChar = 'A';
        }
        newNote = String.valueOf(noteChar);
    } else {
        newNote = note + "#";
    }

    return String.valueOf(newNote);
}