Как получить разные части из одного String?

141
24 июня 2019, 04:20

Есть текстовый файл со следующим текстом

1. 5600 (Hard)
2. 5800 (Easy)
3. ---
...
15. ---

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

BufferedReader reader = new BufferedReader(new FileReader("src/sample/Leaderboard.txt"));
        for(int i = 0; i < 15; i++)
        {
        string[i] = reader.readLine();
        }
        reader.close();

Возможно ли потом из String которые мы записали в массив достать 3 разных элемента и как это сделать?

  1. Порядковый номер (int)

  2. Число после точки (int)

  3. String в конце (String)

И записать все в отдельные переменные. Или надо считывать из файла сразу в переменные? Был какой-то способ считывания, когда устанавлиаешь разделитель, до которого (или после которого) ищет текст. Любая помощь бесценна, спасибо !

Подойдут оба варианта !

Answer 1

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

Может быть, вообще нет смысла хранить читаемые строки, а лучше их обрабатывать сразу по мере чтения. Это зависит от ситуации, вам решать.

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

    package stackoverflow;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    public class Ru_so_922743 {
        // Пример данных для проверки рег. выражения -- список со строками
        static final List<String> data = new ArrayList<String>() {{
                add("1.   5600 (Hard)");
                add("2. 5800    (Easy)");
                add("3. ---");
                add("...");
                add("15. ---");
        }};
        // Регулярное выражение, описывающее образец для разбора строк. 
        // Ищет непутую группу цифр ( \\d+ ), за которой следует точка (\\.), 
        // за которой следует отделенная от них пробелами необязательная непустая группа цифр,
        // за которой после пробелов следует непустая последовательность любых символов.
        // То, что в скобках, помещается в группы, которые нумеруются по порядку: 
        // 0-я группа -- вся совпавшая с образцом строка, 1-я начинается с первой скобки и т.д.
        public static Pattern pattern = Pattern.compile("(\\d+)\\.(\\s+(\\d+))?\\s+(.+)?");
        public static void main(String[] args) {
            data.forEach(s -> {     // Последовательно перебираем строки из списка                      
                Matcher m = pattern.matcher(s); // Применим к строке регулярное выражение
                if (m.find())                                // Есть совпадение с образцом?
                    say("Found: '%s', '%s', '%s'", 
                        m.group(1), m.group(3), m.group(4)); // покажем, что нашли 
                else                                         // Ничего не нашли 
                    say("Nothing found");                    // так и скажем
            });
        }
        private static void say(Object s) { System.out.println(s); } 
        private static void say(String format, Object... data) { 
          System.out.printf(format + "\n", data); 
        } 
    }

Программка выводит следующее:

    Found: '1', '5600', '(Hard)'
    Found: '2', '5800', '(Easy)'
    Found: '3', 'null', '---'
    Nothing found
    Found: '15', 'null', '---'

Из вашего вопроса не совсем ясно, какие именно группы из строк вам нужно выделять. Разберитесь с регулярными выражениями и исправьте образец как вам надо. В примере результаты разбора просто выводятся на экран, но вы можете с таким же успехом помещать их в какие-то переменные (типа number = m.group(1)), сохранять их в коллекциях и делать с ними вообще что угодно.

m.group() возвращает строку, но если вы уверены, что эта строка содержит только цифры (и в разумном количестве), то из такой строки получить int очень просто: int i = Integer.parseInt(s)

READ ALSO
Подскажите библиотеки для рисования (android) [закрыт]

Подскажите библиотеки для рисования (android) [закрыт]

Мне нужна графическая библиотека, в которой можно разместить картинку и нарисовать линию, потому что встроенных адекватных библиотек я не нашёл

135
Странное выполнение блока finally

Странное выполнение блока finally

Всем приветПри регистрации пользователя ему отправляется email с подтверждением через метод sendActiovationEmail

221
Почему отсортированный массив обрабатывается быстрее, чем не отсортированный?

Почему отсортированный массив обрабатывается быстрее, чем не отсортированный?

Вот пример C++ кода, который выглядит очень странноПочему-то, когда данные отсортированы код выполняется почти в шесть раз быстрее

168
Данные в FormData не видны в консоли

Данные в FormData не видны в консоли

Вопрос из любопытства, почему данные в экземпляре FormData не видны при выводе в консоль, но при этом они видны во вкладке Network? Вывод в консоль...

137