list [equals]的表达式类型不符合预期类型seq [[string,int]]

问题描述 投票:1回答:3
def convert(list: List[String]): Seq[Either[String, Int]] = list match {
      case head :: Nil => Right(head.toInt) :: Nil;
      case head :: tail => Right(head.toInt) :: convert(tail) :: Nil;
}

print(convert(List("3", "4", "55")))

我需要一个seq,但它转换成一个列表[equlals],我不知道该怎么做。

scala
3个回答
1
投票

如果你想将List[String]转换为Seq[Either[String,Int]]

val input = List("1", "2", "testString")
//input: List[String] = List(1, 2, testString)

转换:

import scala.util.Try
val output: Seq[Either[String,Int]] =
 input.map(ele => Try(Right(ele.toInt)).getOrElse(Left(ele))).toSeq
//output: Seq[Either[String,Int]] = List(Right(1), Right(2), Left(testString))

0
投票

解:

def convert(list: List[String]): Seq[Either[String, Int]] = list match {
      case head :: Nil => Right(head.toInt) +: Seq.empty;
      case head :: tail => Right(head.toInt) +: convert(tail);
}

0
投票

我很喜欢Rumeshs解决方案,但如果你更喜欢模式匹配风格:

def convert (list: List [String]): List [Either [String, Int]] = list match {
    case Nil => Nil
    case head :: tail => if (head.matches ("[0-9]+"))
        Right (head.toInt) :: convert (tail) else
        Left (head) +: convert (tail)
}

convert (List("3", "four", "55"))
// res304: List[scala.util.Either[String,Int]] = List(Right(3), Left(four), Right(55))

convert (List("3", "4", "55"))
// res305: List[scala.util.Either[String,Int]] = List(Right(3), Right(4), Right(55))

最后将它转换为Seq很容易

convert (List("3", "4", "55")).toSeq

或者使用你自己的方法+ :,然而它会返回一个List,因为List是一个Seq,但它在未通过.toInt调用时错过了。

我没有测试它 - 也许这个解决方案比Try {}方法更快,可能更慢,可能取决于与int的匹配失败的频率。

Rumesh指出,list.map同时工作,所以这里是他的方法的字符串意义上的模式匹配:

List("3", "four", "55") .map (ele => 
    if (ele.matches ("[0-9]+")) Right (ele.toInt) else (Left(ele))).toSeq
// res307: scala.collection.immutable.Seq[Product with Serializable with scala.util.Either[String,Int]] = List(Right(3), Left(four), Right(55))

List("3", "4", "55") .map (ele => 
    if (ele.matches ("[0-9]+")) Right (ele.toInt) else (Left(ele))).toSeq
// res308: scala.collection.immutable.Seq[Product with Serializable with scala.util.Either[String,Int]] = List(Right(3), Right(4), Right(55))
© www.soinside.com 2019 - 2024. All rights reserved.