gpt4 book ai didi

java - java中match(string string)函数的用法

转载 作者:行者123 更新时间:2023-11-30 03:37:03 24 4
gpt4 key购买 nike

我有一个问题:

我正在用 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"

如何使用 match(string string) 修改notesToPlay()方法,或者使用其他方法是否很容易?

你能帮我解决这个问题吗?

最佳答案

使用 tabStr,您可以在字符串中的不同级别嵌套三项数据:

  1. 您有 6 个琴弦需要演奏 - 每个琴弦各占一个新行
  2. 每个字符串都有一个名称(E、A、D、G、B、e)
  3. 音品编号序列,指示弹奏哪个音品以及何时弹奏。

您需要识别并捕获每个事件。

这里假设每个字符串具有相同数量的“节拍”......

不过,以下内容应该可以帮助您确定下一步......

注意,它依赖于有效的输入,它使用“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();
}



}

关于java - java中match(string string)函数的用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27612777/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com