如何使用 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 对象,当您打印普通 numbersymbolfullnameweight 时,实际结果将是 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();
        }

    }
}

变化:

  1. 此处,用于收集每个 Atom 详细信息的 for 循环已移至 main()。请注意,Scanner 实例被传递给 inputmany() 方法。
  2. 添加了另一个 for 循环来显示收集的值。