2013-04-23 65 views
3

我試圖選擇排序從Java轉換爲Scala和即時通訊不能確定如何將這個循環Scala的轉換:轉換Java循環Scala的

for (int j = i + 1; j < N; j++) 

這裏是一個更大的Java代碼示例和斯卡拉相當於:

的Java:

sort(Comparable[] a) 
{ 
int N = a.length; 
for (int i = 0; i < N; i++) 
{ 
    int min = i 
    for (int j = i + 1; j < N; j++) 
} 

斯卡拉:

def sort(a : Array[Ordered[Any]]) = { 
    var N = a.length 

    for (i <- 0 until N) { 
     var min = i 

     for(j <- until j < N){ 

     } 
    } 

    } 

如何將內循環轉換爲Scala?

for (int j = i + 1; j < N; j++) 

我不知道該怎麼做,而分配迭代...

回答

6

在這裏你去:

def sort(a : Array[Ordered[Any]]) = { 
    val N = a.length 

    for (i <- 0 until N) { 
     var min = i 

     for(j <- i + 1 until N){ 

     } 
    } 

    } 

而且,在斯卡拉可以在裏面定義理解的價值觀,以及合併多個塊成一種

def sort(a : Array[Ordered[Any]]) = { 
     val n = a.length 

     for(i <- 0 until n; min = i; j <- i + 1 until n) { // min here is val, not var 
      // do something with i, j and min 
     } 
} 

有時候,這可能會導致更乾淨的代碼

2

不幸的是,Scala的標準循環比較慢(尤其是舊版本)。

一種替代方法是經典的while循環中,即使它不是那麼清楚:

def sort(a : Array[Ordered[Any]]) = { 
    val N = a.length 

    var i = 0; 
    while (i < N) { 
     var min = i 

     var j = i + 1; 
     while (j < N) { 
      j += 1; 
     } 
     i += 1; 
    } 

} 

或尾部遞歸函數:

def sort(a : Array[Ordered[Any]]) = { 
    val N = a.length 

    def l1(i: Int){ 
     def l2(j: Int, min: Int){ 
     if (j < N) 
      l2(j+1, min) 
     } 
     if (i < N) { 
     l2(i+1, i); 
     l1(i+1); 
     } 
    } 
} 

或者尖頂的CFOR:

def sort(a : Array[Ordered[Any]]) = { 
    val N = a.length 

    cfor(0)(_ < N, _ + 1) { i => 
     var min = i 
     cfor(i+1)(_ < N, _ + 1) { j => 
     } 
    } 

} 
+1

參見(http://stackoverflow.com/questions/6146182/how-to-optimize- [這對斯卡拉內涵性能問題]換內涵和 - 循環 - 在 - 斯卡拉)。 – 2013-04-23 20:13:16

+0

@BeniBela by'standard for loops'是否包含'.foreach'? – 2013-04-23 20:20:22

0

迭代使用for循環(不完全是一個功能/慣用的scala方式)將非常類似於java cod即這會讓你度過。

def sort(a: Array[Comparable]) { 
    val N = a.length 
    for (
    i <- 0 until N; 
    min = i; 
    j <- (i + 1) until N 
) { 
    // more code.. 
    } 
} 

下面是引用您的Java代碼:

sort(Comparable[] a) 
{ 
int N = a.length; 
for (int i = 0; i < N; i++) 
{ 
    int min = i 
    for (int j = i + 1; j < N; j++) 
}