Подтвердить что ты не робот

Конкатенация строк из одного списка

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

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

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

Edit

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

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

Ответ 1

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

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

или в script файле

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

Ответ 2

Некоторые варианты поиска для вас:

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

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

Ответ 3

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

Ответ 4

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

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

Это похоже на то, что вы могли бы использовать.

Поскольку конкатенация строк ассоциативна (точнее, она образует моноид, имеющий пустую строку как нейтральный элемент), "направление" складки не имеет значения (по крайней мере, если вас не беспокоит производительность).

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

Ответ 5

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

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

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

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

Ответ 6

Дольше, чем mkString, но более эффективно:

s.foldLeft(новый StringBuilder()) (_ append _). toString()