如何使用 void display() 显示 java 中的多个输入?
How can I use my void display() to show many input in java?
我使用 void display() 来显示输出。但是结果都是最后输入的元素。为什么?
我尝试在 inputmany 中初始化一个数组并在 void display() 中显示它,但出了点问题。
这是我的代码
package atom;
import java.util.Scanner;
public class Atom {
int number;
String symbol;
String fullname;
float weight;
void inputmany(Atom[] a, int n) {
Scanner sc = new Scanner(System.in);
for (int i = 0; i < n; i++) {
System.out.print("Enter atomic number : ");number = sc.nextInt();
System.out.print("Enter symbol : ");symbol = sc.next();
System.out.print("Enter full name : ");fullname = sc.next();
System.out.print("Enter atomic weight : ");weight = sc.nextFloat();
System.out.print("\n");
}
}
void display(Atom[] a, int n) {
for (int i = 0; i < n; i++) {
System.out.println(number + " " + symbol + " " + fullname + " " + weight);
}
}
public static void main(String[] args) {
Atom[] arr;
Scanner sc = new Scanner(System.in);
System.out.print("Enter n: ");int n = sc.nextInt();
System.out.println("Atomic Information");
System.out.println("==================");
arr = new Atom[n];
Atom ob = new Atom();
ob.inputmany(arr, n);
ob.display(arr, n);
}
}
这是因为您需要明确说明要打印哪个 Atom
的号码。在你的 for 循环中,正确的打印是这样的:
System.out.println(a[i].number + " " + a[i].symbol + " " + a[i].fullname + " " + a[i].weight);
但是问题还没有解决
您的 println 仅显示最后一个结果,因为 display() 方法依赖于 Atom
类型的实例。如果您不实例化 Atom
对象,display() 方法将不起作用,就像您在此处所做的那样:
Atom ob = new Atom();
ob.display(arr, n);
现在 display() 方法引用了 ob 对象,当您打印普通 number
、symbol
、fullname
和 weight
时,实际结果将是 ob
属性值。
现在真正的问题从这里开始:
ob.inputmany(arr, n);
首先:您已经初始化了一个 array Atom
类型。现在你必须以几乎与你对数组相同的方式初始化当前 a[i]
对象:a[i] = new Atom()
在 for 循环的开头。
正如我之前所说,一旦您将值设置为普通 number
..weight
属性,它会将值设置为您调用 inputmany
方法。您需要再次指定要设置的对象属性值:
在 inputmany
的 for 循环中,请将 number
更改为 a[i].number
,其他的也一样。
这是我解决你的问题的方法:
public class Atom {
int number;
String symbol;
String fullName;
float weight;
static void createAtoms(Atom[] a) {
Scanner sc = new Scanner(System.in);
for (int i = 0; i < a.length; i++) {
a[i] = new Atom();
System.out.print("Enter atomic number : ");
a[i].number = sc.nextInt();
System.out.print("Enter symbol : ");
a[i].symbol = sc.next();
System.out.print("Enter full name : ");
a[i].fullName = sc.next();
System.out.print("Enter atomic weight : ");
a[i].weight = sc.nextFloat();
System.out.print("\n");
}
}
static void displayAtoms(Atom[] a) {
for (int i = 0; i < a.length; i++) {
System.out.println(a[i].toString());
}
}
@Override
public String toString() {
return "Atom{" +
"number=" + number +
", symbol='" + symbol + '\'' +
", fullName='" + fullName + '\'' +
", weight=" + weight +
'}';
}
public static void main(String[] args) {
Atom[] atoms;
Scanner sc = new Scanner(System.in);
System.out.print("Enter n: ");
int atomsNumber = sc.nextInt();
atoms = new Atom[atomsNumber];
createAtoms(atoms);
displayAtoms(atoms);
}
}
请注意static
关键字,这意味着不需要一个Atom
对象来调用该方法。您的方法不需要 int n
参数,因为您有 .length
选项来获取数组长度。而不是在 println 中写入所有属性,您可以覆盖 toString()
方法并在 for 循环中为每个 Atom
.
调用它
PS:请阅读naming conventions。他们对未来很有帮助:)
在方法 inputmany()
中,您将用户提供的新值设置为相同的变量,有效地覆盖了它们。
为什么 "same variables"?因为你的 Atom 实例总是一样的。 main()
-> Atom ob = new Atom();
中的这一行。因此,ob
指向的实例始终在获取值。
如何解决这个问题
使用这个改变了class:
public class Atom{
int number;
String symbol;
String fullname;
float weight;
void inputmany( Scanner sc ){
System.out.print( "Enter atomic number : " );
number = sc.nextInt();
System.out.print( "Enter symbol : " );
symbol = sc.next();
System.out.print( "Enter full name : " );
fullname = sc.next();
System.out.print( "Enter atomic weight : " );
weight = sc.nextFloat();
System.out.print( "\n" );
}
void display(){
System.out.println( number + " " + symbol + " " + fullname + " " + weight );
}
public static void main( String[] args ){
Atom[] arr;
Scanner sc = new Scanner( System.in );
System.out.print( "Enter n: " );
int n = sc.nextInt();
System.out.println( "Atomic Information" );
System.out.println( "==================" );
arr = new Atom[n];
//Scanner sc = new Scanner( System.in );
for (int i = 0; i < n; i++) {
Atom ob = new Atom();
ob.inputmany( sc );
arr[ i ] = ob;
}
for (int i = 0; i < n; i++) {
Atom ob = arr[ i ];
ob.display();
}
}
}
变化:
- 此处,用于收集每个
Atom
详细信息的 for
循环已移至 main()
。请注意,Scanner
实例被传递给 inputmany()
方法。
- 添加了另一个
for
循环来显示收集的值。
我使用 void display() 来显示输出。但是结果都是最后输入的元素。为什么? 我尝试在 inputmany 中初始化一个数组并在 void display() 中显示它,但出了点问题。 这是我的代码
package atom;
import java.util.Scanner;
public class Atom {
int number;
String symbol;
String fullname;
float weight;
void inputmany(Atom[] a, int n) {
Scanner sc = new Scanner(System.in);
for (int i = 0; i < n; i++) {
System.out.print("Enter atomic number : ");number = sc.nextInt();
System.out.print("Enter symbol : ");symbol = sc.next();
System.out.print("Enter full name : ");fullname = sc.next();
System.out.print("Enter atomic weight : ");weight = sc.nextFloat();
System.out.print("\n");
}
}
void display(Atom[] a, int n) {
for (int i = 0; i < n; i++) {
System.out.println(number + " " + symbol + " " + fullname + " " + weight);
}
}
public static void main(String[] args) {
Atom[] arr;
Scanner sc = new Scanner(System.in);
System.out.print("Enter n: ");int n = sc.nextInt();
System.out.println("Atomic Information");
System.out.println("==================");
arr = new Atom[n];
Atom ob = new Atom();
ob.inputmany(arr, n);
ob.display(arr, n);
}
}
这是因为您需要明确说明要打印哪个 Atom
的号码。在你的 for 循环中,正确的打印是这样的:
System.out.println(a[i].number + " " + a[i].symbol + " " + a[i].fullname + " " + a[i].weight);
但是问题还没有解决
您的 println 仅显示最后一个结果,因为 display() 方法依赖于 Atom
类型的实例。如果您不实例化 Atom
对象,display() 方法将不起作用,就像您在此处所做的那样:
Atom ob = new Atom();
ob.display(arr, n);
现在 display() 方法引用了 ob 对象,当您打印普通 number
、symbol
、fullname
和 weight
时,实际结果将是 ob
属性值。
现在真正的问题从这里开始:
ob.inputmany(arr, n);
首先:您已经初始化了一个 array Atom
类型。现在你必须以几乎与你对数组相同的方式初始化当前 a[i]
对象:a[i] = new Atom()
在 for 循环的开头。
正如我之前所说,一旦您将值设置为普通 number
..weight
属性,它会将值设置为您调用 inputmany
方法。您需要再次指定要设置的对象属性值:
在 inputmany
的 for 循环中,请将 number
更改为 a[i].number
,其他的也一样。
这是我解决你的问题的方法:
public class Atom {
int number;
String symbol;
String fullName;
float weight;
static void createAtoms(Atom[] a) {
Scanner sc = new Scanner(System.in);
for (int i = 0; i < a.length; i++) {
a[i] = new Atom();
System.out.print("Enter atomic number : ");
a[i].number = sc.nextInt();
System.out.print("Enter symbol : ");
a[i].symbol = sc.next();
System.out.print("Enter full name : ");
a[i].fullName = sc.next();
System.out.print("Enter atomic weight : ");
a[i].weight = sc.nextFloat();
System.out.print("\n");
}
}
static void displayAtoms(Atom[] a) {
for (int i = 0; i < a.length; i++) {
System.out.println(a[i].toString());
}
}
@Override
public String toString() {
return "Atom{" +
"number=" + number +
", symbol='" + symbol + '\'' +
", fullName='" + fullName + '\'' +
", weight=" + weight +
'}';
}
public static void main(String[] args) {
Atom[] atoms;
Scanner sc = new Scanner(System.in);
System.out.print("Enter n: ");
int atomsNumber = sc.nextInt();
atoms = new Atom[atomsNumber];
createAtoms(atoms);
displayAtoms(atoms);
}
}
请注意static
关键字,这意味着不需要一个Atom
对象来调用该方法。您的方法不需要 int n
参数,因为您有 .length
选项来获取数组长度。而不是在 println 中写入所有属性,您可以覆盖 toString()
方法并在 for 循环中为每个 Atom
.
PS:请阅读naming conventions。他们对未来很有帮助:)
在方法 inputmany()
中,您将用户提供的新值设置为相同的变量,有效地覆盖了它们。
为什么 "same variables"?因为你的 Atom 实例总是一样的。 main()
-> Atom ob = new Atom();
中的这一行。因此,ob
指向的实例始终在获取值。
如何解决这个问题
使用这个改变了class:
public class Atom{
int number;
String symbol;
String fullname;
float weight;
void inputmany( Scanner sc ){
System.out.print( "Enter atomic number : " );
number = sc.nextInt();
System.out.print( "Enter symbol : " );
symbol = sc.next();
System.out.print( "Enter full name : " );
fullname = sc.next();
System.out.print( "Enter atomic weight : " );
weight = sc.nextFloat();
System.out.print( "\n" );
}
void display(){
System.out.println( number + " " + symbol + " " + fullname + " " + weight );
}
public static void main( String[] args ){
Atom[] arr;
Scanner sc = new Scanner( System.in );
System.out.print( "Enter n: " );
int n = sc.nextInt();
System.out.println( "Atomic Information" );
System.out.println( "==================" );
arr = new Atom[n];
//Scanner sc = new Scanner( System.in );
for (int i = 0; i < n; i++) {
Atom ob = new Atom();
ob.inputmany( sc );
arr[ i ] = ob;
}
for (int i = 0; i < n; i++) {
Atom ob = arr[ i ];
ob.display();
}
}
}
变化:
- 此处,用于收集每个
Atom
详细信息的for
循环已移至main()
。请注意,Scanner
实例被传递给inputmany()
方法。 - 添加了另一个
for
循环来显示收集的值。