【问题标题】:Convert Java loop to Scala将 Java 循环转换为 Scala
【发布时间】:2013-04-17 04:23:51
【问题描述】:

我正在尝试将选择排序从 Java 转换为 Scala,但我不确定如何将此循环转换为 Scala:

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

这是一个更大的 Java 代码示例及其 Scala 等效代码:

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++)

我不知道如何在迭代时进行分配...

【问题讨论】:

    标签: java scala


    【解决方案1】:

    给你:

    def sort(a : Array[Ordered[Any]]) = {
        val N = a.length
    
        for (i <- 0 until N) {
            var min = i
    
            for(j <- i + 1 until N){
    
            }
        }
    
      }
    

    此外,在 Scala 中,您可以在内部定义值以进行理解,并将多个块合并为一个:

    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】:

      不幸的是,标准 for 循环在 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 => 
              }
          }
      
      }
      

      【讨论】:

      【解决方案3】:

      使用 for 循环(不完全是函数式/惯用的 scala 方式)进行迭代将非常类似于 java 代码。这会让你度过难关。

      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++)
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-20
        • 2012-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多