2017-04-18 83 views
-10

1)是否有可能在Scala中使用while循環遍歷數組?雖然循環 - 斯卡拉

2)如何使用reduce循環找到大於50的數字?

val reduce_left_list=List(12,34,54,50,82,34,78,90,3,45,43,1,2343,234) 

val greatest_num=reduce_left_list.reduceLeft((x:Int)=> { for(line <- reduce_left_list) line > 50) 

回答

1

也許你想嘗試filter

List(12,34,54,50,82,34,78,90,3,45,43,1,2343,234).filter(_ > 50) 
1

1)是否有可能通過使用而斯卡拉循環數組來遍歷?

這取決於你的「遍歷數組」的定義。你當然可以做同樣的事情,你會在C中做,例如,取整數,在循環的每次迭代中增加1,當它等於數組的大小時停止,並使用這個整數作爲索引到數組:

val anArray = Array('A, 'B, 'C, 'D) 

var i = 0 
val s = anArray.size 

while (i < s) { 
    println(anArray(i)) 
    i += 1 
} 
// 'A 
// 'B 
// 'C 
// 'D 

但我不會稱之爲「通過一個數組迭代」。你正在迭代整數,而不是數組。

此外,爲什麼要這樣做,如果你只能tell the array to iterate itself

anArray foreach println 
// 'A 
// 'B 
// 'C 
// 'D 

如果你絕對堅持雜耍指數自己(但同樣,你爲什麼要),有比使用while迴路提供更好的方法。你可以,例如,遍歷一個Range

(0 until s) foreach (i ⇒ println(anArray(i))) 

或使用for理解書面:

for (i ← 0 until s) println(anArray(i)) 

循環是從未慣用Scala中。雖然斯卡拉確實允許副作用,它通常習慣於避免它們,並爭取參照透明度。阿爾伯特·愛因斯坦被引述爲「瘋狂正在做同樣的事情,並期待着不同的結果」,但這正是我們期望循環做的事:循環一遍又一遍地執行相同的代碼,但我們期望它做一個每次不同的事情(或至少一次,即停止循環)。根據愛因斯坦,循環是瘋狂的,我們是誰來抗衡愛因斯坦?

儘管如此:儘管如此,循環不能工作,但是Scala社區試圖避免副作用,所以Scala社區試圖避免循環。

2)如何使用reduce循環找到大於50的數字?

在Scala中沒有「減少循環」這樣的事情。我假設你的意思是reduce method

答案是:不可以。類型不對齊。 reduce返回與集合的元素類型相同類型的值,但要返回元素的集合。

可以,但是,使用一個倍,更精確地說,right fold

(reduce_left_list :\ List.empty[Int])((el, acc) => if (el > 50) el :: acc else acc) 
//=> List(54, 82, 78, 90, 2343, 234) 

你也可以使用一個left fold如果你算賬反向結果:

(List.empty[Int] /: reduce_left_list)((acc, el) => if (el > 50) el :: acc else acc) reverse 
//=> List(54, 82, 78, 90, 2343, 234) 

如果您嘗試將元素添加到結果中,而運行時將是二次的而不是線性的:

(List.empty[Int] /: reduce_left_list)((acc, el) => if (el > 50) acc :+ el else acc) 
//=> List(54, 82, 78, 90, 2343, 234) 

然而,他說,「你可以使用左/右折這樣做」是同義反復:左/右折是普遍,這意味着任何你可以用一個集合做,可以用做左/右摺疊。這意味着使用左/右摺疊並不是非常有意義的 - 揭示:由於左/右摺疊可以做任何事情,因此在代碼中看到左/右摺疊並不會告訴讀者關於發生了什麼的任何事情。

因此,只要有可能,您應該使用更專門的操作,以更具意圖的顯示名稱。在這種特殊情況下,你想過濾出一些滿足謂詞的特定元素。和Scala集合API實際上有過濾的方法,它被稱爲filter(驚喜!):

reduce_left_list filter (_ > 50) 
//=> List(54, 82, 78, 90, 2343, 234) 

或者,您可以使用withFilter代替:

reduce_left_list withFilter (_ > 50) 

不同的是,filter回報新列表,而withFilter返回FilterMonadic的實例,該實例是僅包括滿足謂詞的元素的現有列表的視圖

+1

我同意一般不應該「遍歷數組」。但是當你問爲什麼有人會這樣做時:我總是在性能關鍵代碼(數值計算)中做到這一點。所有功能方法,如.map甚至在scala中,都隱式地使用函數調用來運行循環內容代碼。這有一個成本,對於真正關鍵的性能代碼,應該避免。另外,使用函數方法創建許多無用的中間集合非常容易(但可以避免)。 基本上在這些情況下,我使用可變集合和while循環編碼c樣式。 –