Отображение пар ключ / значение содержимого строки в HashMap - PullRequest
2 голосов
/ 27 августа 2010

Я пытаюсь установить способ отображения документа String в HashMap следующим образом:

Строка содержит пару ключ / значение

$key1=value1
$key2=value2 value21
value22
$key3=value3

что я хочу закончить это:

key1, value1
key2, value2 value21\nvalue22
key3, value3

Есть ли шаблон, который я могу использовать для этого? Это выглядит как интересная головоломка, так что до сих пор я придумал использовать split("[$]{1}[A-Za-z]+[=]{1}") для разделения различных значений, но тогда для идентификации ключей должна быть другая итерация, поэтому я ищу более элегантное решение.

Ответы [ 4 ]

1 голос
/ 27 августа 2010

Вы должны использовать два регулярных выражения здесь:
\$(\w+)=((\w+\s*)+) отделит ключи от значений
(\s+) для разделения значений.

String input = "$key1=value1\n" +
        "$key2=value2 value21\n" +
        "value22\n" +
        "$key3=value3";

Pattern keyValuePattern = Pattern.compile("\\$(\\w+)=((\\w+\\s*)+)");
Matcher keyValueMatcher = keyValuePattern.matcher(input); // get a matcher object
Map<String, List<String>> map = new HashMap<String, List<String>>();
while (keyValueMatcher.find()) {
    String key = keyValueMatcher.group(1);
    List<String> values;
    values = Arrays.asList(keyValueMatcher.group(2).split("\\s+"));
    //If you want to update your lists later comment the line above and uncomment those two
    //values = new ArrayList<String>();
    //values.addAll(Arrays.asList(keyValueMatcher.group(2).split("\\s+")));

    map.put(key, values);
}

System.out.println(map); // {key3=[value3], key2=[value2, value21, value22], key1=[value1]}

Примечание: вы также можете использовать \$(\w+)=(.*) в качестве регулярного выражения, это зависит от того, что вы хотите сопоставить, в случае выше, каждому слову / числу, разделенному пробелами, в данном случае, чему угодно.

1 голос
/ 27 августа 2010

Возможно, вы можете взглянуть на Свойства файлов.

Вы можете использовать Properties.load (InputStream) для чтения записей из файлов, используя:

Properties properties = new Properties();
properties.load(this.getClass().getClassLoader()
     .getResourceAsStream("file.properties"));

или даже из строки, используя:

String myString = new String("first=1");
Properties properties = new Properties();
properties.load(new StringBufferInputStream(myString));

Дополнительную информацию о форматировании можно найти в Properties.load (InputStream) doc.

0 голосов
/ 28 августа 2010

Вам необходимо четко указать точно каковы ваши границы и разделители.В случае вашего примера, я предполагаю, что разделителями являются $ в начале строки, за которой следует «слово» (состоящее из \w символов), а затем = символ.

Если мы сделаем упрощающее предположение и скажем, что $ в начале строки является разделителем (независимо от того, что следует), то мы можем сделать что-то вроде этого:затем используйте это в цикле:

static final Pattern pattern = Pattern.compile( " <the above RE> ");
  . . .
Matcher matcher = pattern.matcher(myInputString);
while (matcher.find()) {
    map.put(matcher.group(1), matcher.group(2));
}

(я вообще не проверял ничего из этого, но он должен помочь вам начать)

0 голосов
/ 27 августа 2010

Предполагая, что полный текст находится в строке (= не читается построчно), тогда вы можете работать с несколькими разбиениями:

String input = "$key1=value1\n$key2=value2 value21\nvalue22\n$key3=value3";
String[] lines = input.split("\n");
Map<String, String> map = new HashMap<String, String>();


StringBuilder value = null;
String key = null;
for (String line:lines) {
  if (line.contains('=')) {
    if (key != null) {
      // store the actual k/v pair before starting a new one
      map.put(key, value.toString());
    } else {
      // create a new k/v pair
      String[] temp = line.split("=");
      key = temp[0];
      value = new StringBuilder(temp[1]);
    }
  } else {
    // we have a value that belongs to the last k/v pair
    value.append("\n").append(line);
}
map.put(key, value.toString());

Для решения может потребоваться некоторое-настройка но должна работать в принципе.

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