Как лучше всего преобразовать подмножество строки в переменные массива?

У меня есть такая строка;

abc 1/2/3 3/4/5 4/5/6 6/7/7 efg 1 2 3 4 ...

Я хочу превратить это в;

String[] abc = {1/2/3, 3/4/5, 4/5/6, 6/7/7}
int[] efg = {1, 2, 3, 4}

где abc, efg - переменные, НЕ жестко запрограммированные, а полученные из строки. Мой пример кода не работает, поэтому я не публикую его здесь. Пожалуйста, дайте мне знать, как лучше всего этого добиться. Спасибо!

Эта строка содержит текст, числа или и то, и другое?

Tim Biegeleisen 25.10.2018 04:58

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

Zac 25.10.2018 04:59

Как насчет использования HashMap для сопоставления строки ("efg") со списком строк ({"1", "2", "3", "4"})? То есть, это было бы похоже на Map<String, List<String>> data - обратите внимание, что данные - это переменная, и обе "abc" и "efg" - записи в ней, и каждая запись представляет собой последовательность строк ... это отличается от псевдокода, который не Не много, потому что Java статически типизирована (и вопрос не предполагает генератора кода Java).

user2864740 25.10.2018 04:59

Спрашивать о выводе, содержащем массивы разных типов, - непростой вопрос. Считаете ли вы приемлемым вернуть строковые массивы Только?

Tim Biegeleisen 25.10.2018 04:59

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

Zac 25.10.2018 05:00

Сформулируйте свой вопрос однозначно. Непонятно, о чем вы спрашиваете.

Behrang 25.10.2018 05:01

Привет @ user2864740 - возможно, у вас есть пример, как это сделать? Мне нужно использовать эти значения позже для арифметики, например, если они являются целыми числами - это единственное требование.

Zac 25.10.2018 05:03

Привет @Behrang - перечитал, и в вопросе нет ничего двусмысленного. Понятно, что я пытаюсь создать разные типы данных из строкового значения, и что есть список элементов, которые необходимо назначить для этой переменной. У меня даже есть наглядный пример ввода и вывода.

Zac 25.10.2018 05:05
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
8
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Map<String, String[]> map = new HashMap<>();
String input = "abc 1/2/3 3/4/5 4/5/6 6/7/7 efg 1 2 3 4";
String[] exps = input.split("\\s+(?=[A-Za-z]+)");
for (String exp : exps) {
    String[] parts = exp.split("\\s+");
    map.put(parts[0], Arrays.copyOfRange(parts, 1, parts.length));
}

// iterate each name, and then print out each string in a given array
for (Map.Entry<String, String[]> entry : map.entrySet()) {
    for (String val : entry.getValue()) {
        System.out.println(entry.getKey() + ": " + val);
    }
}

abc: 1/2/3
abc: 3/4/5
abc: 4/5/6
abc: 6/7/7
efg: 1
efg: 2
efg: 3
efg: 4

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

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

map.get("efg")[1]

Привет спасибо. Если позже в коде я должен использовать значение 2 (например, efg [1]), как я могу ссылаться на это с карты?

Zac 25.10.2018 05:17

Другие вопросы по теме