Как обработать строку в Java? - PullRequest
0 голосов
/ 04 апреля 2020

Формат рассматриваемой строки:

1:{O:{o1,Brasil,F1,G2,E1},N:{n1,Albania,D2,V2,R2,E1,A2}}

Дело в том, что я использую split(","), и у меня есть две строки, и из каждой из них я должен создать объект с указанными атрибутами. Как я могу прочитать каждый из атрибутов и использовать их в соответствующем месте?

1 Ответ

0 голосов
/ 05 апреля 2020

Для этого я предоставляю два конкретных c метода, которые могут быть полезны для других вещей, кроме этой конкретной задачи.

Первый метод - это метод bracketsMaxDepth () , который возвращает глубину конкретной вложенной скобки. Поддерживаемые скобки (), [], {}, <>. Интересующие вас скобки - это фигурные скобки ( {} ).

Второй метод - это getNestedBracketedGroups () метод, который будет анализировать (извлекать) содержимое групп вложенных скобок внутри строки в квадратных скобках и возвращает содержимое этих групп в одномерном (1D) массиве строк. Поддерживаемые скобки: (), [], {}, <>. Интересующие вас скобки - это фигурные скобки ( {} ).

bracketsMaxDepth () метод используется внутри getNestedBracketedGroups () для внутреннего использования. метод. Например, для разбора следующей строки:

String line = "1:{O:{o1,Brasil,F1,G2,E1}," + 
              "G:{g1,Germany,D2,V2,F1,G2,E1}," + 
              "N:{n1,Albania,D2,V2,R2,E1,A2}}";

мы можем сделать что-то вроде этого (я добавил дополнительное существо для тестирования):

String line = "1:{O:{o1,Brasil,F1,G2,E1},G:{g1,Germany,D2,V2,F1,G2,E1},N:{n1,Albania,D2,V2,R2,E1,A2}}";
line = line.trim();

// Get player Number
String player = line.substring(0, line.indexOf(":"));
// Is the player a string representation of a integer number?
if (!player.matches("\\d+")) { 
    // Nope...exit
    return; // or whatever exit mechanism you need to use.
}
int playerNumber = Integer.parseInt(player);

// Get Player's Creatures...
String[] playerCreatures = getNestedBracketedGroups(line, 1, "{}", 
                            true)[0].split(",(?![^\\{\\}]*\\})");

// Display creatures data
System.out.println("Creatures for Player #" + playerNumber);
for (int i = 0; i < playerCreatures.length; i++) {
    String creat = playerCreatures[i];
    int creatureNumber = i + 1;
    String creatureType= creat.substring(0, creat.indexOf(":"));
    // Get creature Attributes
    String[] creatureAttributes = creat.substring((creatureType + ":").length() + 1, 
                                  creat.length() - 1).split("\\s{0,},\\s{0,}");

    System.out.println("\tCreature #" + creatureNumber);
    System.out.println("\t\tCreature Type: " + creatureType);
    for (int j = 0; j < creatureAttributes.length; j++) {
        System.out.println("\t\t\tAttribute #" + (j + 1) + ": " + creatureAttributes[j]);
    }
}

Анализируемый вывод в Окно консоли будет выглядеть следующим образом:

Creatures for Player #1
    Creature #1
        Creature Type: O
            Attribute #1: o1
            Attribute #2: Brasil
            Attribute #3: F1
            Attribute #4: G2
            Attribute #5: E1
    Creature #2
        Creature Type: G
            Attribute #1: g1
            Attribute #2: Germany
            Attribute #3: D2
            Attribute #4: V2
            Attribute #5: F1
            Attribute #6: G2
            Attribute #7: E1
    Creature #3
        Creature Type: N
            Attribute #1: n1
            Attribute #2: Albania
            Attribute #3: D2
            Attribute #4: V2
            Attribute #5: R2
            Attribute #6: E1
            Attribute #7: A2

Метод bracketsMaxDepth () :

<code>/**
 * This method takes a string and returns the maximum depth of nested
 * brackets. The bracket type to check the depth for is supplied within the
 * bracketType parameter.<br><br>
 *
 * @param bracketedString (String) The string to process.<br>
 *
 * @param bracketType     (String - Default is "()") Either a open bracket,
 *                        or a close bracket, or both open and closed
 *                        brackets can be supplied (no white-spaces). This
 *                        method will process any <b>one</b> of 4 different
 *                        bracket types and they are as follows:<pre>
 *
 *      ()      Parentheses       (Default)
 *      {}      Curly Braces
 *      []      Square Brackets
 *      &lt;&gt;      Chevron Brackets
* * @return (Integer) максимальная глубина поставляемого типа кронштейна. 0 возвращается *, если в поставляемой * строке нет скобок типа, указанного. -1 возвращается, если есть дисбаланс * в поставляемой строке указанного типа скобок. Для каждой открытой * скобки должна быть закрывающая скобка и наоборот. * / publi c stati c int bracketsMaxDepth (String bracketedString, String ...cketType) {char open = '('; // По умолчанию char close = ')'; // По умолчанию if (BrackType.length> 0) {String bType = Character.toString (BrackType [0] .charAt (0)); switch (bType) {case "(": case ")": open = '('; close = ')'; перемена; case "{": case "}": open = '{'; close = '}'; перемена; case "[": case "]": open = '['; close = ']'; перемена; case "<": case ">": open = '<'; close = '>'; перемена; по умолчанию: выбросить новое IllegalArgumentException ("\ nbracketsMaxDepth () Ошибка метода! \ n" + "Указан неизвестный тип скобок (" + bType + ")! \ n"); }} int current_max = 0; // текущий счет int max = 0; // общее максимальное количество int n = bracketedString.length (); char [] c = bracketedString.toCharArray (); // Обходим входную строку для (int i = 0; i max) {max = current_max; }} иначе if (c [i] == закрыть) {if (current_max> 0) {current_max--; } else {return -1; }}} // наконец проверяем несбалансированную строку if (current_max! = 0) {return -1; } return max; }

Метод getNestedBracketedGroups () :

<code>/**
 * This method will parse out (retrieve) the contents of nested brackets
 * groups within a bracketed string and return those group contents within a
 * 1D String Array. The best way to see how this works is by examples. Let's
 * say we have the following bracketed string:
 * <pre>
 *
 *      String a = "1(2(3)(4))(5(6)(7))";

*

* В приведенной выше строке мы Можно видеть, что есть два экземпляра групп уровня 1 * в скобках, которые в каждой группе уровня 1 вкладывают еще две группы уровня 2 * в скобках: *

 *
 *       Level 1         Level 2
 *      (2(3)(4))        (3) (4)
 *
 * ==================================
 *
 *       Level 1         Level 2
 *       (5(6)(7))       (6) (7)

*

* Группы в скобках: (2 (3 ) (4)) и (5 (6) (7)) оба * считаются находящимися на уровне гнезда 1 (уровень 1 - самый внешний уровень). Они * являются отдельными группами, потому что у них обоих есть свой набор внешних * скобок. В каждой группе уровня 1 у нас есть два набора групп * уровня в скобках * (всего 4 группы уровня 2), которые состоят из: (3) & * (4) и (6) & * (7) .

*

* Этот метод также использует StringUtils TokenJar .BracketsMaxDepth () * метод. * * @param bracketedString (String) Строка, содержащая * заключенный в скобки контент для анализа.
* * @param wantedDepth (Integer) По умолчанию 0 (полная глубина). * Вложенная глубина для извлечения содержимого в скобках * из.
Если указанная глубина скобки * глубже, чем то, что содержится в * входной строке, то IllegalArgu- * mentException выдается, объясняя как * такой , * * @paramcketType (String) Вы должны указать тип скобки для * обработки. Это можно сделать, указав * одну открывающую или закрывающую скобку или обе открытые * и закрывающие скобки, например, любая из * следующих допустимых записей, если * требуются скобки:

 *
 *      "("     ")"     "()"    ")("

* * Any может поставляться один из четырех (4) типов кронштейнов. Допустимые скобки * Типы: *
 *
 *      ()      Parentheses
 *      {}      Curly Braces
 *      []      Square Brackets
 *      &lt;&gt;      Chevron Brackets
* * @param removeOuterBrackets (Необязательно - Boolean - Значение по умолчанию - false). По умолчанию внешние скобки для каждой найденной * группы также прикрепляются к возвращенным * результатам. Если для этого необязательного * параметра задано значение true, внешние скобки удаляются * из возвращенных результатов группы.
* * @return (1D String Array) Требуются определенные вложенные группы.
* * @throws IllegalArgumentException, если a глубина указана больше, чем * доступная глубина в квадратных скобках *, содержащаяся в предоставленной входной строке. Это * исключение также генерируется, если обнаруживается *, что указанный тип скобки * несбалансирован (открытые и закрытые скобки * неправильно спарены) в пределах входной * входной строки. * / publi c stati c String [] getNestedBracketedGroups (String bracketedString, int requiredDepth, String bracketType, boolean ... removeOuterBrackets) {boolean removeOuter = false; if (removeOuterBrackets.length> 0) {removeOuter = removeOuterBrackets [0]; } int d = bracketsMaxDepth (bracketedString, rackType); if (requiredDepth == 0) {// По умолчанию для этого метода 0 (полная глубина). требуемая глубина = 1; } if (d == -1) {// Бросить исключение ... throw new IllegalArgumentException ("\ n \ ngetNestedBracketedGroups () Ошибка метода! \ n" + "Несоответствие скобок в предоставленной строке! \ n"); } else if (d ": open = '<'; close = '>'; перемена; по умолчанию: throw new IllegalArgumentException ("\ ngetNestedBracketedGroups () Ошибка метода! \ n" + "Указан неизвестный тип скобок (" + bType + ")! \ n"); } List list = new ArrayList <> (); int n = bracketedString.length (); char [] c = bracketedString.toCharArray (); int глубина = 0; String strg = ""; for (int i = 0; i = требуемая глубина)) {если (c [i] == закрыть) {глубина--; } strg + = Character.toString (c [i]); if (глубина <требуемая глубина) {strg = strg.trim (); if (removeOuter) {if (strg.startsWith (Character.toString (open))) {strg = strg.substring (1); } if (strg.endsWith (Character.toString (close))) {strg = strg.substring (0, strg.lastIndexOf (Character.toString (close))); }} list.add (strg); strg = ""; } Продолжить; } if (c [i] == close) {глубина--; } if (! strg.equals ("")) {strg = strg.trim (); if (removeOuter) {if (strg.startsWith (Character.toString (open))) {strg = strg.substring (1); } if (strg.endsWith (Character.toString (close))) {strg = strg.substring (0, strg.lastIndexOf (Character.toString (close))); }} list.add (strg); strg = ""; }} if (! strg.equals ("")) {strg = strg.trim (); if (removeOuter) {if (strg.startsWith (Character.toString (open))) {strg = strg.substring (1); } if (strg.endsWith (Character.toString (close))) {strg = strg.substring (0, strg.lastIndexOf (Character.toString (close))); }} list.add (strg); // + Character.toString (close)); } // (красный (синий)) серый ((оранжевый) зеленый) return list.toArray (new String [list.size ()]); } </code>
...