2013-02-13 2 views
3

что-то менее настоятельной, чем это:Идиоматические Scala перебрать все подстроки

def subs(s: String) = for {start <- 0 to s.length; end <- i to s.length} yield s.substring(start, end)

+3

Учитывая, что этот код работает нормально, вы можете отправить его в codereview вместо stackoverflow. – placeybordeaux

+4

Я всегда смущен всеми различными сайтами stackexchange - есть программисты, codereview, stackoverflow, codegolf и около полудюжины других, и по моему опыту я получаю лучший ответ здесь, чем где-либо еще. – pathikrit

+0

Я мог ошибаться, вот что мне кажется. Codereview, похоже, имеет гораздо более длинные фрагменты кода, но это, безусловно, означает, что ваш код идиоматичен. Но я согласен, что stackoverflow кажется уловкой. Программисты, похоже, больше сосредоточены на не актуальной кодирующей части программирования, т. Е. Работают в команде, работают над документацией и т. Д. Codegolf просто пытается получить наименьший объем кода. Опять же, вы были здесь намного дольше, чем я, похоже. – placeybordeaux

ответ

10
scala> "asdf".inits.flatMap(_.tails).toList 
res2: List[String] = List(asdf, sdf, df, f, "", asd, sd, d, "", as, s, "", a, "", "") 

Если вы хотите удалить пустые строки:

scala> "asdf".inits.flatMap(_.tails.toList.init).toList 
res3: List[String] = List(asdf, sdf, df, f, asd, sd, d, as, s, a) 

Но обратите внимание, что это колдовство не настолько очевидный для читателя, как отмечает @Randall Schulz в комментариях. С другой стороны, ваша оригинальная версия моментально понятна.

+0

+1, хотя ИМО было бы еще лучше без повторной пустой строки. –

+0

@AlexDiCarlo - он генерирует тот же результат, что и фрагмент в вопросе. На самом деле я не могу придумать хороший способ избавиться от пустых строк - я мог бы добавить '.filter (_. NonEmpty)', но это было бы не так чисто. – Rogach

+0

Да, поэтому я не предлагал решение самостоятельно, похоже, не способ избежать использования фильтра. Было бы еще менее чисто, если бы вы хотели сохранить одну пустую строку. 'toSet', вероятно, тоже не сработает, поскольку я могу представить пример использования, в котором вы хотите перебирать повторы (за исключением пустой строки). –

Смежные вопросы