Java从类方法中获取多个值

时间:2014-04-16 14:13:01

标签: java

我是Java OOP的新手,我正在尝试制作一个解决二度方程的简单程序。

package sistemiequazioni;

public class sistemi {

    private double delta(double a, double b, double c) {
     return (b*b) - 4*a*c;
    }

    public double[] grado2(double a, double b, double c) {
     double Delta = delta(a,b,c);

     if (Delta > -1) {
       double x1 = (-b-Math.sqrt(Delta))/(2*a);
       double x2 = (-b+Math.sqrt(Delta))/(2*a);
       return new double[] { x1 , x2 };
     } else {
       return 0;
     }

    }

我有一个包含2个类的包:这个类名为sistemi,另一个名为form1,其中包含main。在form1我使用:

sistemi d = new sistemi();

//get the values of a,b,c from the jTextFields

double[] k = new double[2];
k = d.grado2(a, b, c);

jTextField1.setText(String.valueOf(k[1]) + " and " + k[2]);

它返回2个值(x1和x2),我需要将它们存储在名为k的数组中。我怎么能这样做?

正如我已经说过的,我对这些新东西很新。我用google搜索了这个,我发现了如何从方法中传递多个值,而不是如何将它们存储在变量中。

3 个答案:

答案 0 :(得分:1)

您可以执行

,而不是仅返回0,因为您的返回类型为double[]
else {

      return new double[] { 0 , 0 };

     }

同样在comments数组中建议从索引0开始。所以你需要使用

jTextField1.setText(String.valueOf(k[0]) + " and " + k[1]);

答案 1 :(得分:1)

当前问题

您不能返回0,因为0不是数组。你可以做的是返回一个只包含一个元素的数组,但你必须仔细考虑你给返回值的含义。

如果你希望你的方法返回一个包含解决方案的数组,那么就这样吧,但它不会总是长度为2.你必须处理所有可能的情况:

  • 如果有2个解决方案:return new double[] { x1, x2 };
  • 如果只有一个解决方案:return new double[] { x };
  • 如果没有解决方案:return new double[0];

逻辑错误

您的代码逻辑中也存在错误。某些Delta值未得到妥善处理:

  • if -1 < Delta < 0那么你没有解决方案(我假设你不在这里使用复数)
  • 如果Delta == 0那么只有一个解决方案,即-b/(2*a)(因为它是双解决方案,你可能想要返回一个包含它两次的数组,所以这种情况可能没问题)

我认为你对Delta的测试应该是:

if (Delta > 0) {
    // calculate 2 solutions x1 and x2
    return new double[] { x1, x2 };
} else if (Delta == 0) {
    // calculate 1 solution x
    return new double[] { x };
} else {
    return new double[0]; // no solution
}

或者,如果您想考虑单一解决方案是两次解决方案的事实:

if (Delta >= 0) {
    // calculate 2 solutions x1 and x2
    return new double[] { x1, x2 };
} else {
    return new double[0]; // no solution
}

如何使方法将事物存储在变量

在您当前的版本中,您就是这样做的:

double[] k = new double[2]; // creates an array of double that contains 2 slots
k = d.grado2(a, b, c); // REPLACES it by whatever the method returned

k只是一个指向已创建数组的变量。如果你用其他东西(例如方法的返回值)影响它,那么它就不再指向你以前的数组了。

可以做的是将k 作为方法的参数传递,并且您的方法将写入该数组的插槽中。但是,这里不需要这样做。此外,你不能事先知道会有2个解决方案,除非你处理复杂的数字,但这是另一个故事。

因此,您应该通过以下方式替换上述两行:

double[] k = d.grado2(a, b, c);

答案 2 :(得分:1)

首先,在调用函数之前,您不需要创建数组,因为函数已经创建并返回一个数组:

double[] k = new double[2];
k = d.grado2(a, b, c);
/// into
double[] k = d.grado2(a, b, c);

其次,如果必须返回2个有意义的值,则返回具有2个成员的类的对象。或者更好的是,创建一个代表等式的类,并使用getter返回每个结果:

public class QuadraticEquation {
    private Double solution1;
    private Double solution2;
    public QuadraticEquation(double a, double b, double c) {
        // delta 0 has 1 solution, delta > 0 has 2 solution
        double delta = b * b - 4 * a * c;
        if (delta >= 0) {
            solution1 = (-b - Math.sqrt(delta)) / (2 * a);
            solution2 = (-b + Math.sqrt(delta)) / (2 * a);
        }
    }
    public boolean hasSolutions() {
        return solution1 != null || solution2 != null;
    }
    public Double getSolution1() {
        return solution1;
    }
    public Double getSolution2() {
        return solution2;
    }
}

我使用Double类型,因为它可以有null值,这意味着没有解决方案。 Java会自动将其加倍。因此,您可以编写此代码:

QuadraticEquation eq = new QuadraticEquation(1, 2, 1);
if (eq.hasSolutions()) {
    if (eq.getSolution1() == eq.getSolution2()) {
        System.out.println("Equation has solution " + eq.getSolution1();
    } else {
        System.out.println("Equation has solutions " + eq.getSolution1() + 
           " and " + eq.getSolution2());
    }
} else {
    System.out.println("Equation has no real solutions ");
}