Как встроить список в список в Groovy, учитывая некоторые условия?

#groovy

#groovy

Вопрос:

У меня есть такой заводной код :

 main = []
b="ogodtsneeencs"
def input = ["go", "good", "do", "sentences", "tense", "scen"]
(0..(input.size()-1)).each{ Sp(input[it]) }
def Sp(def a)
{
        flag = false
        list = []
        (0..(a.size()-1)).collect { list << a[it] }
        ans = list.permutations().each { temp =  it.join()
                                           if(b.find("$temp"))
                                           {
                                                main << it
                                                flag = true
                                           }
}
        if(flag == false)
                main << null

}
println main
  

какие результаты :

 [[o, g], [g, o], [o, g, o, d], [o, d], [t, s, n, e, e, e, n, c, s], [t, s, n, e, e], [e, n, c, s]]
  

То, что я здесь делаю, — это найти возможные перестановки, которые произошли при b использовании input . И я получаю выходные данные по мере необходимости. Но если внимательно следить за выводом, для одного и того же ввода go i.e( input[0] ) выдает первые два вывода main[0] and main[1] , т.е. Поскольку для сохранения типа индекса (т.Е. Для input которого main создается вывод), как я могу изменить приведенный выше код, чтобы вывод возвращался следующим образом :

 [[[o, g], [g, o]], [o, g, o, d], [o, d], [t, s, n, e, e, e, n, c, s], [t, s, n, e, e], [e, n, c, s]]
  

Указание на то, что первые оба вывода одинаковы для одного и того же ввода, в нашем случае это так input[0] .

Заранее спасибо.

Ответ №1:

Решение Артура может быть дополнительно доработано до:

 def Sp(a) {
  (a as List).permutations().findAll { s -> b.find( s.join() ) }
}
  

Комментарии:

1. кажется, это намного Groovier

Ответ №2:

Я также немного упростил ваш код:

 b="ogodtsneeencs"
def input = ["go", "good", "do", "sentences", "tense", "scen"]
main = input.collect { Sp(it) }
def Sp(a) {
  def list = a as List
  def result = []
  list.permutations().each {
    if (b.find(it.join())) result << it
  }
  result
}
  

Это приведет к:

 [[[o, g], [g, o]], [[o, g, o, d]], [[o, d]], [[t, s, n, e, e, e, n, c, s]], [[t, s, n, e, e]], [[e, n, c, s]]]
  

Если вы хотите иметь все одноэлементные наборы без включающего набора (как вы написали в своем примере, хотя я нахожу это немного непрактичным), то вы можете просто поменять последнюю строку Sp на:

 result.size() == 1 ? result[0] : result 
  

Комментарии:

1. Извините, это работает не так, как ожидалось!! Возвращает тот же результат, что и мой код!

2. Может быть, вы что-то неправильно ввели? Попробуйте запустить его отсюда

3. Извините, Я. Этот код работает. Но можете ли вы объяснить, как это работает? Как вы создали свой код для встраивания списка, как я просил об этом?

4. Функция Sp теперь возвращает список (на который ссылается result ), который заполнен всеми соответствующими перестановками. Итак, в строке 3 мы создаем список списков.