Java从类方法中获取多个值
我对Java OOP非常陌生,我正在尝试编写一个简单的程序来求解二次方程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
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)
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)应以小写字母开头。