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

时间:2014-12-23 01:07:16

标签: 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(字符串字符串)修改notesToPlay()方法,还是使用其他方法很容易?

你可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

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

  1. 你有6个字符串可供播放 - 每个字符串都在新行上
  2. 每个字符串都有一个名称(E,A,D,G,B,e)
  3. 一系列音品编号,表示播放哪个音品,以及何时播放。
  4. 您需要识别并捕获每个事件。

    这里假设每个字符串具有相同数量的'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();
        }
    
    
    
    }