Как динамически преобразовать массив 2d в массив 3d в groovy

Как мы можем динамически преобразовать 2d-массив в 3d. У меня есть ввод ниже, и я разделяю, используя закрытие для 2d-массива, но как мы можем преобразовать в 3d-массив путем разделения на основе #.

def input = '''123456789#987465321,7410258#9630
852014864#456486454,5454646#4454''';

input=input.split('\n').collect{it.split(',')}

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

input=input.collect{it.split('#')};

Caught: groovy.lang.MissingMethodException: No signature of method: [Ljava.lang.String;.split() is applicable for argument types: (java.lang.String) values: [#]
Possible solutions: split(groovy.lang.Closure), wait(), sort(), init(), toList(), tail()
groovy.lang.MissingMethodException: No signature of method: [Ljava.lang.String;.split() is applicable for argument types: (java.lang.String) values: [#]
Possible solutions: split(groovy.lang.Closure), wait(), sort(), init(), toList(), tail()
    at com.test.TextScript$_run_closure2.doCall(TextScript.groovy:10)
    at com.test.TextScript.run(TextScript.groovy:10)

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

Пример:

    static def split(def input,def delimiter){
    .
    .
    .
    }

def input = '''123456789#987465321,7410258#9630
852014864#456486454,5454646#4454'''; 
def result1=split(input,'\n');
println result1//1d [123456789#987465321,7410258#9630, 852014864#456486454,5454646#4454]

def result2=split(result1,',');
println result2//2d [[123456789#987465321, 7410258#9630], [852014864#456486454, 5454646#4454]]

def result3=split(result2,'#');
println result3// three dimension[[[123456789],[987465321], [7410258],[9630]], [[852014864],[456486454], [5454646],[4454]]]
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
0
163
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Не совсем понятно, в каком формате вы хотите получить данные. Это приблизит вас к решению:

def input = '''123456789#987465321,7410258#9630
852014864#456486454,5454646#4454'''

input.readLines().each { line ->
    println line.split(/,|#/)
}

Отпечатки:

[123456789, 987465321, 7410258, 9630]
[852014864, 456486454, 5454646, 4454]

Если вы хотите это в структуре данных, рассмотрите карту:

Map m = [:]
input.readLines().each { line ->
    line.split(/,/).each { kv ->
        List pairs = kv.split(/#/)
        m.put(pairs[0], pairs[1])
    }
}

println m

Производит:

[123456789:987465321, 7410258:9630, 852014864:456486454, 5454646:4454]

Обновлено:

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

import java.util.Collections

List li = []
input.readLines().each { line ->
    line.split(/,/).each { kv ->
        li.add(kv)
        li.each {
            Collections.replaceAll(li, kv, []+kv.split(/#/))
        }
    }
}

println li

Он выводит:

[[[123456789, 987465321]], [[7410258, 9630]], [[852014864, 456486454]], [[5454646, 4454]]]

Вы должны иметь возможность обернуть его в метод и параметризовать его самостоятельно.

Я хотел разделить строку на 2d, 3d данные в зависимости от количества раз, когда происходит разделение. Параметр разделения может быть любым, поэтому мы не можем взять каждую строку. Мне нужно написать метод, который принимает входные данные и параметр разделения и разделяет данные. Предположим, что данные 1d, они будут преобразованы в 2d, если данные 2d после разделения, они будут 3d.

rahul 24.12.2020 14:35

@rahul, пожалуйста, отредактируйте свой вопрос, добавив образец вывода/формата/структуры, который вы ожидаете для своего примера.

ou_ryperd 24.12.2020 14:44

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

rahul 24.12.2020 15:04
Ответ принят как подходящий

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

def multiSplit(String input, List res) {
  def result = input.split(res.head())
  res.size()>1 ? result.collect{ multiSplit(it, res.tail()) } : result
}

println(multiSplit('''123456789#987465321,7410258#9630
852014864#456486454,5454646#4454''', ["\n", ",", "#"]))
// → [[[123456789, 987465321], [7410258, 9630]], [[852014864, 456486454], [5454646, 4454]]]

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