Как мы можем динамически преобразовать 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]]]
Не совсем понятно, в каком формате вы хотите получить данные. Это приблизит вас к решению:
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]]]
Вы должны иметь возможность обернуть его в метод и параметризовать его самостоятельно.
@rahul, пожалуйста, отредактируйте свой вопрос, добавив образец вывода/формата/структуры, который вы ожидаете для своего примера.
извините, я обновил, можете ли вы проверить сейчас, я хотел знать, как мне реализовать метод для части динамического многомерного массива.
Вы можете сделать это с помощью рекурсивной функции. Пройти в начальный ввод, который вы хотите разделить, и список регулярных выражений. На каждом шагу следующий разделение будет выполнено с помощью регулярного выражения для глубины. Например.
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]]]
Я хотел разделить строку на 2d, 3d данные в зависимости от количества раз, когда происходит разделение. Параметр разделения может быть любым, поэтому мы не можем взять каждую строку. Мне нужно написать метод, который принимает входные данные и параметр разделения и разделяет данные. Предположим, что данные 1d, они будут преобразованы в 2d, если данные 2d после разделения, они будут 3d.