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

Конкатенация строк исчезла

Предположим, что существует 3 строки:

protein, starch, drink

Объединив их, мы могли бы сказать, что на ужин:

Пример:

val protein = "fish"
val starch = "chips"
val drink = "wine"

val dinner = protein + ", " + starch + ", " + drink

Но что, если чего-то не хватало, например, белка, потому что моя жена ничего не могла поймать. Тогда у нас будет: ,chips, drink на ужин.

Существует гладкий способ конкатенации строк, чтобы добавить запятые - я просто не знаю, что это такое;-). У кого-нибудь есть хорошая идея?

Я ищу что-то вроде:

val dinner = protein +[add a comma if protein is not lenth of zero] + starch .....

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

4b9b3361

Ответ 1

Когда вы говорите "он может отсутствовать", этот тип сущности должен быть Option[T]. Тогда,

def dinner(components: List[Option[String]]) = components.flatten mkString ", "

Вы бы вызывали его так:

scala> dinner(None :: Some("chips") :: Some("wine") :: Nil)
res0: String = chips, wine

Если вы абсолютно хотите проверить пустоту строки,

def dinner(strings: List[String]) = strings filter {_.nonEmpty} mkString ", "

scala> dinner("" :: "chips" :: "wine" :: Nil)
res1: String = chips, wine

Ответ 2

Вы ищете mkString для коллекций, возможно.

val protein = "fish"
val starch = "chips"
val drink = "wine"

val complete = List (protein, starch, drink) 
val partly =  List (protein, starch) 

complete.mkString (", ")
partly.mkString (", ")

приводит к:

res47: String = fish, chips, wine
res48: String = fish, chips

Вы даже можете указать начало и конец:

scala> partly.mkString ("<<", ", ", ">>")
res49: String = <<fish, chips>>

Ответ 3

scala> def concat(ss: String*) = ss filter (_.nonEmpty) mkString ", "
concat: (ss: String*)String

scala> concat("fish", "chips", "wine")
res0: String = fish, chips, wine

scala> concat("", "chips", "wine")
res1: String = chips, wine

scala>

Ответ 4

Это касается случая пустых строк, а также показывает, как вы могли бы поместить другую логику для фильтрации и форматирования. Это будет отлично работать для List[String] и обобщается на List[Any].

val input = List("fish", "", "chips", 137, 32, 32.0, None, "wine")

val output = input.flatMap{ _ match { 
  case None => None
  case x:String if !x.nonEmpty => None
  case x:String => Some(x)
  case _ => None
}}
.mkString(",")

res1: String = fish,chips,wine

Идея заключается в том, что flatMap принимает List[Any] и использует сопоставление для назначения None для любых элементов, которые вы не хотите хранить в выходном файле. Ноны сглаживаются, а Сомусы остаются.

Если вам нужно иметь возможность обрабатывать разные типы (Int, Double и т.д.), вы можете добавить еще несколько случаев.

Ответ 5

println(s"$protein,$starch,$drink")