2014-10-31 3 views
1

Добрый день. Поэтому я хочу спросить вас, как изменить подстроку в строке, полученной из JEditorPane.Сменная замена в строке

Im делает программа для аккордов Changin в соответствии с этим: C до C#, C# в D, D # Е, Е к 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

После того, как код должен быть:

С # Е

+2

'final' является ключевым словом и НЕ должен использоваться как имя переменной. – WarrenFaith

+0

Это просто для здесь, это называется konacno в моем коде. – vulovicv

+0

Вы должны быть осторожны, когда вы меняете код «здесь», потому что люди могут видеть: этот код даже не компилируется и просто пропустить этот вопрос ... – WarrenFaith

ответ

2

Напиши это наоборот. Это происходит, потому что вы уже установили C на C#, когда тестируется C#.

+0

или "if else chaining" – WarrenFaith

+0

Да, но это должно пройти весь путь. Итак, все происходит так: CtoC#, C# toD, DtoD #, D # toE, EtoF, FtoF #, F # toG, GtoG #, G # toA, AtoA #, A # toH и HtoC. – vulovicv

1

Ваша текущая проблема - это порядок, в котором вы заменяете записи. Когда вы начинаете с

C D# E 

и заменить каждую C на C#, переменная будет содержать

C# D# E 

Если вы замените все C# на D, переменная будет содержать

D D# E 

и т. д.

Замена их в другом направлении разрешит ее, например сначала заменяя C# на D и только потом заменяя C на C#.

Единственная сложная часть заключается в том, что вам нужно обойтись и заменить H на C. Решение для этого состоит в том, чтобы начать замену H на X (или любой другой символ, который не возникает), сделать все другое замены в правильном порядке и в качестве последнего шага замените X на C еще раз.

+0

Это было полезно, спасибо. – vulovicv

+0

только один вопрос, так что я должен сказать следующее: replaceAll («C#», «D»). ReplaceAll («C», «C#») , но как продолжать, поэтому у меня нет такого разрешения, как у меня было до? – vulovicv

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); 
} 
Смежные вопросы