Как разбить строки и сохранить в хэш-карту строк в Java - PullRequest
0 голосов
/ 13 декабря 2018

Я хочу разбить строку ниже

G04: AMPARAMS | DCode = 50 | XSize = 66mil | YSize = 66mil | CornerRadius = 0mil | HoleSize = 0mil | Использование = FLASHONLY | Вращение = 0,000 |XOffset = 0mil | YOffset = 0mil | HoleType = Round | Shape = Octagon | *

Сначала я разбивал код от '|' знака трубы, а затем снова разделял от '=' знака равенства, но проблема яЯ сталкиваюсь здесь с тем, как сохранить значение в hashmap, поскольку они находятся в цикле, поэтому я не могу сохранить его в hashmap.Любое возможное решение будет оценено.

String[] temp=line.split("\\|");
for(String p:temp){
    HashMap<String,String>attributes=new HashMap<String,String>();
    String[] key =p.split("\\=");

    for(String tmp:key){
    //System.out.println(tmp);
    attributes.put();
    }

Ответы [ 3 ]

0 голосов
/ 13 декабря 2018

Это легче сделать с помощью потоков:

Arrays.stream(input.split("\\|"))
      .map(s -> s.split("="))
      .filter(a -> a.length == 2)
      .collect(toMap(a -> a[0], a -> a[1], (l, r) -> r, HashMap::new));
  • Arrays.stream создайте Stream<String>, который мы затем сможем дополнительно уточнить в нашем запросе с помощью нескольких встроенных методов потокового API .
  • map разбивает каждую строку на "=", поэтому возвращает Stream<String[]>
  • filter, сохраняя элементы массива, которые имеют ровно два элемента
  • окончательномы поставляем toMap коллектор для метода collect для построения Map<String, String>
0 голосов
/ 13 декабря 2018

Нет потоков:

public static Map<String, String> split(String str) {
    final Pattern sep = Pattern.compile("\\s*\\|\\s*");
    final Pattern eqSep = Pattern.compile("(?<key>[^=\\s]+)\\s*=\\s*(?<value>[^=]+)");

    Map<String, String> map = new HashMap<>();

    for (String part : sep.split(str)) {
        Matcher matcher = eqSep.matcher(part);

        if (matcher.matches())
            map.put(matcher.group("key"), matcher.group("value"));
    }

    return map;
}

С потоками:

public static Map<String, String> split(String str) {
    final Pattern sep = Pattern.compile("\\s*\\|\\s*");
    final Pattern eqSep = Pattern.compile("(?<key>[^=\\s]+)\\s*=\\s*(?<value>[^=]+)");

    return sep.splitAsStream(str)
              .map(eqSep::matcher)
              .filter(Matcher::matches)
              .collect(Collectors.toMap(matcher -> matcher.group("key"), matcher -> matcher.group("value")));
}
0 голосов
/ 13 декабря 2018

Похоже, что вам нужно:

String[] temp = line.split("\\|");
Map<String,String> attributes = new HashMap<String,String>();
for (String p : temp) {
    String[] key = p.split("\\=");
    if (key.length == 2) {
        attributes.put(key[0],key[1]);
    }
}

Обратите внимание, что вы должны создать один HashMap вне цикла, так как вы хотите сохранить все пары ключ-значение в одном HashMap.

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