我有一个问题:
我正在测试一个吉他标签播放器应用程序。
播放此标签;
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"
如何使用match(字符串字符串)修改notesToPlay()方法,还是使用其他方法很容易?
你可以帮我解决这个问题吗?
答案 0 :(得分:2)
使用tabStr,您可以在字符串中的不同级别嵌套三个数据项:
您需要识别并捕获每个事件。
这里假设每个字符串具有相同数量的'beats'....
但是,以下内容可以帮助您找出接下来的步骤.....
注意,它依赖于有效输入,它使用'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();
}
}