У меня есть вопрос:
Я тестирую приложение для вкладки с гитарой в Java.
Для воспроизведения этих вкладок;
String tabstr =
"e|-------------------------------|\n"
+ "B|-5-5-6-8-8-6-5-3-1-1-3-5-5-3-3-|\n"
+ "G|-------------------------------|\n"
+ "D|-------------------------------|\n"
+ "A|-------------------------------|\n"
+ "E|-------------------------------|\n";
такая функция используется;
public String notesToPlay()
{
String result = new String();
boolean firstIteration = true;
for (String fret: match(tab, "/(\\d+)/g"))
{
if (!firstIteration)
result += " ";
result += "B" + fret;
firstIteration = false;
}
return result;
}
Результат этой функции выглядит примерно так:
"B5 B5 B6 B8 B8 B6 B5 B3 B1 B1 B3 B5 B5 B3 B3"
Если я хочу играть на этих вкладках;
String tabstr =
"e|-7-----7-----7-----7-----5-----3-----3-----2-----0-----0-----|\n"
+ "B|---0-----0-----0-----0-----0-----0-----0-----0-----0-----0---|\n"
+ "G|-----0-----0-----0-----0-----0-----0-----0-----0-----0-----0-|\n"
+ "D|-------------------------------------------------------------|\n"
+ "A|-------------------------------------------------------------|\n"
+ "E|-------------------------------------------------------------|\n";
и если выход должен быть таким;
"e7 B0 G0 e7 B0 G0 e7 B0 G0 e7 B0 G0 e5 B0 G0 e3 B0 G0 e3 B0 G0 e2 B0 G0 e0 B0 G0 e0 B0 G0"
как я могу изменить метод notesToPlay(), используя match (string string), или легко использовать другой подход?
Не могли бы вы помочь мне в этом вопросе?
С вашей вкладкой вы имеете три элемента данных, вложенных на разных уровнях строки:
Вам нужно определить и уловить каждое из этих событий.
Здесь есть предположение, что каждая строка имеет одинаковое количество "ударов"....
Тем не менее, следующее поможет вам разобраться в следующих шагах.....
Обратите внимание, что он полагается на действительный ввод, он использует "split", чтобы разбить каждую строку на отдельную строку.
Он использует toCharArray для разбивки каждой строки на отдельные ласки.
Ваши требования не указывают, что делать с ладами> 9... так что это упражнение для вас.
В коде хранится каждый аппликатор в новом внутреннем классе, а затем снова создается, чтобы получить нужный вам результат.
Для меня выход:
e7 B0 G0 e7 B0 G0 e7 B0 G0 e7 B0 G0 e5 B0 G0 e3 B0 G0 e3 B0 G0 e2 B0 G0 e0 B0 G0 e0 B0 G0
Ваши результаты могут быть разными.
public class DeTab {
private static class TabString {
private final int[] frets;
private final String name;
public TabString(String name, int[] frets) {
super();
this.frets = frets;
this.name = name;
}
public int[] getFrets() {
return frets;
}
public String getName() {
return name;
}
}
public static void main(String[] args) {
String tabstr =
"e|-7-----7-----7-----7-----5-----3-----3-----2-----0-----0-----|\n"
+ "B|---0-----0-----0-----0-----0-----0-----0-----0-----0-----0---|\n"
+ "G|-----0-----0-----0-----0-----0-----0-----0-----0-----0-----0-|\n"
+ "D|-------------------------------------------------------------|\n"
+ "A|-------------------------------------------------------------|\n"
+ "E|-------------------------------------------------------------|\n";
System.out.println(decode(tabstr));
}
private static String decode(String tabstr) {
String[] splitTab = tabstr.trim().split("\\s*\n\\s*"); // split on new line.
TabString[] strings = new TabString[splitTab.length];
int spos = 0;
int longest = 0;
for (String tabString : splitTab) {
tabString = tabString.trim();
String[] parts = tabString.split("\\|", 3);
String name = parts[0];
char[] fingers = parts[1].toCharArray();
int[] frets = new int[fingers.length];
int pos = 0;
for (char c : fingers) {
if (Character.isDigit(c)) {
frets[pos] = Character.getNumericValue(c);
} else {
frets[pos] = -1;
}
pos++;
}
strings[spos++] = new TabString(name, frets);
longest = Math.max(longest, frets.length);
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < longest; i++) {
for (int s = 0; s < strings.length; s++) {
int[] fret = strings[s].getFrets();
if (fret.length >= i && fret[i] >= 0) {
sb.append(strings[s].getName()).append(fret[i]).append(" ");
}
}
}
if (sb.length() > 0) {
sb.setLength(sb.length() - 1);
}
return sb.toString();
}
}
String
. Если данные находятся в такой длинной строковой форме, я бы рекомендовал разбивать каждую ноту. Подобноtabstr.split("\|")
, и затем вы можете перемещаться от0 to n-1
массива каждой заметки, предполагая, что они имеют одинаковую длину.