Java从类方法中获取多个值

Java从类方法中获取多个值,java,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

我对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;
     }

    }
我有一个包含两个类的包:一个名为
sistemi
,另一个名为
form1
,其中包含main。在
表格1中
我使用:

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
的数组中。我怎么做呢


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

而不是只返回0,因为返回类型是
double[]

else {

      return new double[] { 0 , 0 };

     }
也如注释数组中所建议的,从索引0开始。所以你需要使用

jTextField1.setText(String.valueOf(k[0]) + " and " + k[1]);
当前问题 无法返回0,因为0不是数组。可以做的是返回一个只包含一个元素的数组,但必须仔细考虑返回值的含义

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

  • 如果有两种解决方案:
    返回新的double[]{x1,x2}
  • 如果只有1个解决方案:
    返回新的double[]{x}
  • 如果没有解决方案:
    返回新的双精度[0]
逻辑错误 代码逻辑中还有一个错误。一些
Delta
值处理不当:

  • 如果
    -1
    ,则您没有解决方案(我假设您在这里不使用复数)
  • 如果
    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
作为方法的参数进行传递,然后方法将写入该数组的插槽中。然而,这里不需要这样做。此外,除非处理复数,否则您无法预先知道将有两种解决方案,但这是另一种情况

因此,应将上述两行替换为:

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

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

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 ");
}

类名应以大写字母开头。缩进由您决定,但我从未见过有人在java中使用2个空格。关于你的代码:数组是0索引的,所以使用
k[0]
k[1]
哦,是的,你说得对,我刚才注意到了。我习惯于使用Delphi。可能与您的问题没有直接关系(正如KEYSER在这里已经建议的),但您可能会发现在这里查找它很有用:有关二次等式计算器的一些建议和技巧。@Phoenix请不要编辑问题中的代码。类名应以大写字母开头,而变量名(如Delta)应以小写字母开头。