美好的一天。所以我想问你如何更改我从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
答案 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);
}