Как я могу использовать мой void display () для отображения большого количества входных данных в java? - PullRequest
0 голосов
/ 23 января 2020

Я использую 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);

}

}

Ответы [ 2 ]

1 голос
/ 23 января 2020

Это потому, что вам нужно явно указать, какой номер Atom вы печатаете. В вашем для l oop правильная печать будет выглядеть так:

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

Прежде всего: вы инициализировали массив типов Atom. Теперь вам нужно инициализировать текущий объект a[i] почти так же, как вы делали с массивом: a[i] = new Atom() в начале для l oop.

И, как я уже говорил, один раз вы устанавливаете значение для простых атрибутов number .. weight, оно устанавливает значение для текущего объекта, который вызывается методами inputmany. Вам снова нужно указать, какие значения атрибутов объекта вы устанавливаете:

В вашем для l oop с inputmany, пожалуйста, измените 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 l oop для каждого Atom.

PS : пожалуйста читать соглашения об именах . Они очень полезны в будущем :)

0 голосов
/ 23 января 2020

В методе inputmany() вы устанавливаете новые значения, предоставленные пользователем для тех же переменных, эффективно перезаписывая их.

Почему "те же переменные"? Потому что ваш экземпляр Atom всегда один и тот же. Эта строка в main() -> Atom ob = new Atom();. Таким образом, экземпляр, на который указывает ob, всегда получает значения.

Как решить эту проблему

Используйте этот измененный класс:

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. Здесь for l oop для сбора данных для каждого Atom был перемещен в main(). Обратите внимание, что экземпляр Scanner передается методу inputmany().
  2. Еще один for l oop был добавлен для отображения собранных значений.
...