Конкатенация строк из одного списка - PullRequest
13 голосов
/ 13 сентября 2011

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

Мне нужно просто взять строки в одном списке и присоединиться к ним.Итак, concat(List("a","b","c")) возвращает abc.

Должен ли я сначала увидеть, сколько строк в списке, таким образом, я могу просто просмотреть и присоединить их все?Я чувствую, что это нужно сделать в первую очередь, чтобы вы могли использовать списки как массив и делать list[1] append list[2] append list[3] и т. Д.

Редактировать :

Вот моя идея, конечно, с ошибками компиляции ..

def concat(l: List[String]): String = {
var len = l.length
var i = 0
    while (i < len) {
        val result = result :: l(i) + " "
    }
result
}

Ответы [ 6 ]

31 голосов
/ 13 сентября 2011

Как насчет этого, на REPL

List("a","b","c") mkString("")

или в файле сценария

List("a","b","c").mkString("")
2 голосов
/ 13 сентября 2011

Некоторые варианты для изучения:

  1. обязательно: для цикла;используйте методы из объекта List для определения длины цикла или используйте для каждого элемента List
  2. классический функционал: рекурсивная функция, по одному элементу за раз с использованием
  3. функций высшего порядка: посмотрите на сгиб.

Учитывая базовый уровень проблемы, я думаю, что вы изучаете некоторые основы программирования.Если языком выбора является Scala, возможно, основное внимание уделяется функциональному программированию, поэтому я бы приложил усилия к решению № 2, а затем решению № 1.№ 3 для дополнительных кредитов.

1 голос
/ 13 сентября 2011

Это упражнение призвано побудить вас задуматься о проблеме с функциональной точки зрения. У вас есть набор данных, по которому вы хотите перейти, выполняя набор идентичных операций. Вы уже определили императивную циклическую конструкцию (for). Достаточно просто. Теперь, как бы вы встроили это в функциональную конструкцию, не полагаясь на "отслеживание состояния"?

0 голосов
/ 05 мая 2013

Немного длиннее, чем mkString, но более эффективно:

s.foldLeft (new StringBuilder ()) (_ append _). ToString ()

0 голосов
/ 13 сентября 2011

Я просто предполагаю, что вы не только новичок в Scala, но и новичок в программировании в целом.Я не говорю, что SO не предназначен для новичков, но я уверен, что есть много других мест, которые лучше подходят для ваших нужд.Например, книги ...

Я также предполагаю, что вашу проблему не нужно решать функционально, императивно или каким-либо другим способом.Это просто должно быть решено как домашнее задание.

Итак, вот список вещей, которые вы должны рассмотреть / спросить себя:

  • Если вы хотите объединить все элементов списка, вам действительно нужно знать, сколько их?
  • Если вы думаете, что вы это делаете, хорошо, но после решения этой проблемы, используя этот подход, попробуйте немного поиграть со своим решением.чтобы выяснить, есть ли другой способ.
  • Добавление элементов в результирующий список - это мысль в правильном направлении, но подумайте об этом: помимо объектно-ориентированного языка Scala также является полнофункциональным функциональным языком,Возможно, вы не знаете, что это значит, но все, что вам нужно знать на данный момент, это: это чертовски хорошо с такими вещами, как списки (LISP - самый известный функциональный язык, и он обозначает LISt Processing, что должно указывать накакой-то, тебе не кажется?;)).Так что, может быть, есть какой-то волшебный (может быть, даже идиоматический Scala) способ выполнить такое объединение, не определяя окончательный список самостоятельно.
0 голосов
/ 13 сентября 2011

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

http://en.wikipedia.org/wiki/Fold_%28higher-order_function%29

Это звучит как то, что вы могли бы использовать.

Поскольку конкатенация строк ассоциативна (точнее, она образует моноид с пустой строкой в ​​качестве нейтрального элемента), «направление»сгиба не имеет значения (по крайней мере, если вас не беспокоит производительность).

Кстати, о производительности: в реальной жизни было бы неплохо использовать StringBuilder для промежуточных шагов, но это зависит от вас, если вы хотите использовать его.

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