Java множественный сплит - сохранить разделители - PullRequest
2 голосов
/ 01 декабря 2011

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

Вводится следующее:

[NAME] Боб[НОМЕР] 12456703[УЛИЦА] Что-нибудь [UNIT] 32 [SUBURB] Benmore

Я хочу иметь возможность ввести эти данные в hasmap, где текст в скобках будет ключом, а информация не в скобкахданные.Я пытался использовать подстроку и разделить, но у меня возникли проблемы, когда было более одного набора скобок на строку?Большое спасибо

Ответы [ 4 ]

3 голосов
/ 01 декабря 2011

Если производительность не является большой проблемой (т. Е. Размер входных файлов не слишком велик), вы можете сделать следующее:

input = input.replaceAll("\\[","\n\\[")

, чтобы сделать ввод одним скобкой на строку, уменьшив тем самымпроблема с той, которую вы уже решили.

3 голосов
/ 01 декабря 2011

Примерно так будет работать.

package se.wederbrand.stackoverflow.arraysorter;

import java.util.HashMap;
import java.util.Scanner;

public class ArraySorter {
    public static void main(String[] args) {
        String testString = "[NAME] Bob\n" +
                "[NUMBER] 12456703\n" +
                "[STREET] Anything [UNIT] 32 [SUBURB] Benmore ";

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

        Scanner scanner = new Scanner(testString);
        // this sets the delimiter to either [ or ]
        scanner.useDelimiter("[\\[\\]]");
        while (scanner.hasNext()) {
            String key = scanner.next();
            String value = scanner.next();

            // trim() removes any extra space or line breaks and leaves a clean string
            map.put(key.trim(), value.trim());
        }
    }
}
2 голосов
/ 01 декабря 2011

Попробуйте это:

 HashMap<String, String> map = new HashMap<String, String>(); 
 Pattern regex = Pattern.compile("(\\[\\w+\\])\\s+(\\w+)");
 Matcher regexMatcher = regex.matcher(subjectString);
 while (regexMatcher.find()) {
     // matched text: regexMatcher.group(i)
     // add group 1 to key and group 2 to value of hash
     map.put(regexMatcher.group(1), regexMatcher.group(2));
 } 
1 голос
/ 01 декабря 2011

Одна идея (несмотря на то, что она менее эффективна, чем использование регулярных выражений) - разделить ваши данные на пустое место на строку (если действительно ваши данные имеют свободное пространство между ключом и значениями). Скорее всего, вы получите какой-то массив.

Затем проверьте, есть ли у токена открывающая скобка, и если это так, вы должны указать его как клавишу HashMap. В противном случае это значение.

PriorityQueue

может быть хорошей коллекцией для хранения этих значений, потому что вы можете peek() и poll() данные.

...