2014-10-31 262 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); 
}