Scala 比较错误

Scala comparison error

我正在尝试将字符串类型列表中的项目与整数进行比较。我尝试这样做,但我收到一条错误消息:

'value < is not a member of List[Int]'

比较的代码行与此类似:

if(csvList.map(x => x(0).toInt) < someInteger)

除了为什么会发生这种情况,我想知道为什么我没有得到错误 当我使用不同类型的比较时,例如“==”。

所以如果我 运行 行:

if( csvList.map(x => x(0).toInt) == someInteger)

我没有收到错误。这是为什么?

您可以参考 Why == operator and equals() behave differently for values of AnyVal in Scala

每个class都支持运算符==,但可能不支持<,>这些运算符。

在您的代码中

csvList.map(x => x(0).toInt)

它returns一个List,应用程序用它来与一个int进行比较, 因此它可能会处理隐式类型转换。甚至编译器也不会将其报告为错误。一般来说,不同类型比较值是不好的。

csvList.map(x => x(0).toInt) 将整个 csvList 转换为 List[Int],然后尝试将运算符 < 应用于 List[Int]someInteger,这不存在。这基本上就是错误消息所说的内容。

== 没有错误,因为 List 存在此运算符,尽管 List[T] == Int 将始终 return false。

也许您想要做的是将 List 的每一项与 Int 进行比较。如果是这样的话,像这样的事情会做:

scala> List("1","2","3").map(x => x.toInt < 2)
res18: List[Boolean] = List(true, false, false)

这段代码csvList.map(x => x(0).toInt)实际上是returns一个List[Int],那是不能和整数比较的(不知道说List(1,2) < 3是什么意思) . 如果你想将列表的每个元素与你的数字进行比较,确保它们都不如它,你实际上会写 if(csvList.map(x => x.toInt).forall { _ < someInteger })

在回答问题之前,让我们先做一些介绍 使用 REPL 你可以更了解你在做什么

scala> List("1", "2", "3", "33").map(x => x(0).toInt)
res1: List[Int] = List(49, 50, 51, 51)

映射函数用于转换每个元素,因此映射中的 x 第一次为“1”,第二次为“2”,依此类推。

当您使用 x(0) 时,您正在访问字符串中的第一个字符。

scala> "Hello"(0)
res2: Char = H

如您所见,映射字符串后的类型是一个 Int 列表。您可以将其与 Int 进行比较,但它们永远不会相等。

scala> List(1, 2, 3) == 5
res0: Boolean = false

当您尝试

时,这与 Java 非常相似
"Hello".equals(new Integer(1));

如果您想了解更多平等问题背后的原因,您可以查看Why has Scala no type-safe equals method?

最后但并非最不重要的一点是,使用 less than 时会出错,因为 List class.

中没有 less than

额外: 如果你想知道列表中的第二个元素是否小于 2 你可以这样做

scala> val data = List("1", "10", "20")
data: List[String] = List(1, 10, 20)
scala> 5 < data(1).toInt
res2: Boolean = true

虽然有点奇怪,但也许你应该将字符串列表转换成更像 case 的类型class,然后用更清晰的数据模型来处理你的业务逻辑。