2013-04-23 44 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++) 
}