Java 字段从方法返回后有错误的值,而使用 void 方法计算它会产生正确的结果

标签 java methods field pass-by-reference

下面是我编写的用于计算给定数组的平衡索引的以下代码。

public class Equilibrium{
    private int lowerSum =0;

     public int equilibrium(int[] A) {
        for(int i=0; i<A.length;i++)
        {
            if(lowerSum(A, i) == upperSum(A,i))
            {
                return i;
            }
        }
        return -1;

     }

    private int lowerSum(int[] ar, int index)
    {
        if(index == 0)
            return 0;
        lowerSum += ar[--index];
        return lowerSum;
    }

    //This can be fixed accordingly in a similar way lowerSum
    //was implemented to have a time complexity of O(n) but
    //this is not relevant to the problem here
    private int upperSum(int[] ar, int index)
    {
        int sum=0;
        for(int i= index+1; i<ar.length; i++)
        {
            sum+=ar[i];
        }
        return sum;
    }
}

上面的代码没有产生正确的结果。例如以下测试:

  assertEquals(1, solution.solution(new int[]{1,2,1}));
  assertEquals(3, solution.solution(new int[]{3,5,8,9,5,3,8}));

第一个通过,但第二个没有。这是因为计算 lowerSum 字段错误+1。 然而,对代码进行以下更改会产生正确的结果:

private int lowerSum =0;

 public int solution(int[] A) {
    for(int i=0; i<A.length;i++)
    {
        lowerSum(A, i);
        if( lowerSum== upperSum(A,i))
        {
            return i;
        }
    }
    return -1;

 }    

private void lowerSum(int[] ar, int index)
{
    if(index == 0)
        lowerSum = 0;
    else
        lowerSum += ar[--index];

}

有人可以向我解释一下为什么会发生这种情况吗?

最佳答案

在第一个实现中,您只需返回 0。在第二个实现中,您在返回 lowerSum 之前将 lowerSum 设置为 0。

已修复:

private int lowerSum(int[] ar, int index)
{
    if(index == 0) {
        lowerSum = 0;
    } else {
        lowerSum += ar[--index];
    }
    return lowerSum;
}

关于Java 字段从方法返回后有错误的值,而使用 void 方法计算它会产生正确的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31733270/

相关文章:

java - 在 JSP 中使用 jQuery/JavaScript 代码

java - 我可以将 URI 连接到 Camel 代理类的每个方法吗?

c# - 我应该尽可能使我的方法静态化吗?

java - 我自己的数组列表

xml - 如何从 SharePoint 2010 中的数据库中找到 SharePoint 列表的字段?

c# - 调试被动属性时自动调用属性 getter

java - 如何在 TextField Java Swing 上获取值

java - 有没有办法在应用程序启动时以编程方式设置特定的终端字体?

java - 如何从 Java 类中的另一个方法调用我的方法?

mysql - Sphinx 为 mysql 主键自增 id 创建属性