Эффективный способ разбора строки - PullRequest
4 голосов
/ 10 мая 2011

скажем, например, у вас есть строка, которая имеет ключевые значения, но переменные после нее могут меняться, например:

KEY1=variable1, KEY2=variable2, KEY3=variable3

Что я хочу знать, так это лучший способ извлечь переменную1, переменную2 иvariable3.Было бы хорошо, если бы я знал подстроки и получал их каждый раз, но я не знаю, как переменные могут измениться.Обратите внимание, что ключи не меняются

Ответы [ 4 ]

5 голосов
/ 10 мая 2011

Вы можете попробовать это:

String str = "KEY1=variable1, KEY2=variable2, KEY3=variable3";
String[] strArr = str.split(",");
String[] strArr2;
for (String string : strArr) {
    System.out.println(string);  // ---- prints key-value pair
    strArr2 = string.trim().split("=");
    System.out.println(strArr2[1]);  // ---- prints value
}
2 голосов
/ 10 мая 2011

Если вы хотите быть сверхэффективным, без создания ненужных объектов или посимвольной итерации, вы можете использовать indexOf, который более эффективен, чем посимвольное зацикливание для больших подстрок.

public class ValueFinder {
  // For keys A, B, C will be { "A=", ", B=", ", C=" }
  private final String[] boundaries;

  /**
   * @param keyNames To parse strings like {@code "FOO=bar, BAZ=boo"}, pass in
   *     the unchanging key names here, <code>{ "FOO", "BAZ" }</code> in the
   *     example above.
   */
  public ValueFinder(String... keyNames) {
    this.boundaries = new String[keyNames.length];
    for (int i = 0; i < boundaries.length; ++i) {
      boundaries[i] = (i != 0 ? ", " : "") + keyNames[i] + "=";
    }
  }

  /**
   * Given {@code "FOO=bar, BAZ=boo"} produces <code>{ "bar", "boo" }</code>
   * assuming the ctor was passed the key names <code>{ "FOO", "BAZ" }</code>.
   * Behavior is undefined if {@code s} does not contain all the key names in
   * order.
   */ 
  public String[] parseValues(String s) {
    int n = boundaries.length;
    String[] values = new String[n];
    if (n != 0) {
      // The start of the next value through the loop.
      int pos = boundaries[0].length();
      for (int i = 0; i < n; ++i) {
        int start = pos;
        int end;
        // The value ends at the start of the next boundary if
        // there is one, or the end of input otherwise.
        if (i + 1 != n) {
          String next = boundaries[i + 1];
          end = s.indexOf(next, pos);
          pos = end + next.length();
        } else {
          end = s.length();
        }
        values[i] = s.substring(start, end);
      }
    }
    return values;
  }
}
2 голосов
/ 10 мая 2011

Вариант решения Гарри, который будет обрабатывать пространство вокруг, и = в значении:

String str = "KEY1=variable1, KEY2=variable2, KEY3=variable3    ,    a = b=1, c";
Map<String, String> map = new LinkedHashMap<String, String>();
for (String string : str.trim().split(" *, *")) {
    String[] pair = string.split(" *= *", 2);
    map.put(pair[0], pair.length == 1 ? null : pair[1]);
}
System.out.println(map);

печать

{KEY1=variable1, KEY2=variable2, KEY3=variable3, a=b=1, c=null}
1 голос
/ 10 мая 2011

Если значения переменных не могут содержать запятые или пробелы, вы можете просто разбить строку на массив, используя "," в качестве токена разделения. Затем вы можете дополнительно разбить каждый ключ на знак равенства, чтобы получить и ключ, и значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...