использование функции соответствия (строковая строка) в Java

1

У меня есть вопрос:

Я тестирую приложение для вкладки с гитарой в 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), или легко использовать другой подход?

Не могли бы вы помочь мне в этом вопросе?

  • 0
    Это довольно широкий вопрос - не имеет особого смысла моделировать такие данные в виде String . Если данные находятся в такой длинной строковой форме, я бы рекомендовал разбивать каждую ноту. Подобно tabstr.split("\|") , и затем вы можете перемещаться от 0 to n-1 массива каждой заметки, предполагая, что они имеют одинаковую длину.
  • 0
    Спасибо, Майк, я думаю, что создание массива char лучше. Но если бы вы могли написать метод для меня, это было бы здорово. :)
Теги:

1 ответ

2
Лучший ответ

С вашей вкладкой вы имеете три элемента данных, вложенных на разных уровнях строки:

  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();
    }



}
  • 0
    Спасибо, Рольфл, это очень полезный ответ :)
  • 0
    Спасибо, Янош.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню