2016-02-11 171 views
0

我想比較從一個類型字符串列表項目到一個整數。我試圖這樣做,但我得到一個錯誤說:斯卡拉比較錯誤

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

的,用於比較這行代碼是類似於此:

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

而且爲什麼出現這種情況的時候,我不知道爲什麼我當我使用不同類型的比較時,例如'==',沒有得到錯誤 。

所以,如果我跑行:

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

我沒有得到一個錯誤。這是爲什麼?

+0

一切都有成員'等於'。人們不喜歡那樣。這是一個Java的東西。 –

回答

1

讓我們回答這些問題 使用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?

最後但並非最不重要,因爲List類中不少於1個,所以使用少於1個時出現錯誤。

附加: 如果你想知道,如果在列表中的第二個元素是小於2,你可以做

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

雖然這是一個有點怪,也許你應該變換字符串列表是更像一個案例類更類型,然後用更清晰的數據模型做你的業務邏輯。

+0

這是很棒的信息@JonasAnso!不過,我試圖比較列表中的一個特定元素。例如,如果someInterger <名單上的第二個元素.. –

+0

我試過電梯,但這給了我同樣的錯誤。任何想法如何實現這一目標? –

+1

我已經更新了額外 –

1

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

每個類支持的==操作符,但可能不支持<,>這些運營商。

在你的代碼

它返回一個列表INT < >和應用程序使用它與INT來比較, 所以它可以處理一個隱式類型轉換。即使編譯器也不會將其報告爲錯誤。一般來說,將價值與不同類型進行比較並不好。

1

csvList.map(x => x(0).toInt)轉換整個csvListList[Int],然後嘗試操作<適用於List[Int]someInteger不存在。這實質上就是錯誤信息的意思。

==沒有錯誤,因爲該算子存在List雖然List[T] == Int將始終返回false。

也許你想要做的是將List的每個項目與Int進行比較。如果是這樣的話,像這樣的事:

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

的一段代碼csvList.map(x => x(0).toInt)實際上返回一個List[Int],這不是一個整數可比性(不知道這將意味着什麼說List(1,2) < 3)。 如果你想在列表中你的號碼中的每個元素進行比較,確保它們都遜色於它,你實際上寫if(csvList.map(x => x.toInt).forall { _ < someInteger })