2014-10-31 263 views
1

美好的一天。所以我想问你如何改变我从JEditorPane得到的字符串中的子串。字符串中的字符串替换

林制造用于和弦了变化的程序根据这样的:C 1至C#,C#至d,d#到E,E至F,F到F#,F#,以G,G至G#,...

我编写代码,但总是从乞讨到最后。例如,如果我在JEditorPane中编写代码:

“CD#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); 
     } 
    } 
} 

下面是一个例子: 原文:

Çd·E

代码后应该是:

C#库电子

+2

'final'是一个关键字,不应该用作变量名称。 – WarrenFaith 2014-10-31 14:23:53

+0

它只是在这里,它在我的代码中被称为konacno。 – vulovicv 2014-10-31 14:27:12

+0

你应该小心,当你改变代码“就在这里”,因为人们可能会看到:该代码甚至没有编译,只是跳过这个问题... – WarrenFaith 2014-10-31 14:29:51

回答

2

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

+0

或“if else chaining” – WarrenFaith 2014-10-31 14:20:47

+0

是的,但它应该一路走来。因此,整个事情就像这样:CtoC#,C#toD,DtoD#,D#toE,EtoF,FtoF#,F#toG,GtoG#,G#toA,AtoA#,A#toH和HtoC。 – vulovicv 2014-10-31 14:22:43

1

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

C D# E 

和更换每一个C到C#,你的变量将包含

C# D# E 

如果再更换所有的C#至d,您的变量将包含

D D# E 

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

唯一棘手的部分是您需要能够绕过并将H替换为C.解决方案是先用X(或任何其他不会发生的字符)替换H,然后执行所有其他操作按照正确的顺序进行替换,并作为最后一步再次用C替换X.

+0

这很有帮助,谢谢。 – vulovicv 2014-10-31 15:12:38

+0

只是一个问题,所以,我应该这样写: replaceAll(“C”,“D”)。replaceAll(“C”,“C#”) 但如何连续,所以我没有像我有分离之前? – vulovicv 2014-10-31 16:07:55

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); 
}