2017-12-19 14 views
-3

開始時に、私は20サイズの入力フィールドを入力しています(つまり、std_idname、...など)。 私はstartでlengthを初期化する代わりに、これらのフィールドの動的配列を作成したいと考えています。 動的配列には、ユーザーが入力した入力ごとの長さを割り当てる必要があります。 以下のコードを参考にしてください。入力に応じてJavaで動的配列を作成する方法は?

public class Input { 
    private int[] std_id = new int[20];// initiating 20 size 
    private String[] name = new String[20]; 
    private int[] age = new int[20]; 
    private String[] email = new String[20];; 

    Scanner in = new Scanner(System.in); 

    private final List<Student> Students = new ArrayList<Student>(); 

    public Input() 
    { 
     initInput(); 
    } 

    public void initInput() 
    { 
     int rec; 
     System.out.println("How many records do u want to enter:"); 
     rec = in.nextInt(); 



     for(int i=0 ; i <= rec; i++) 
     { 
      std_id[i] = in.nextInt(); 
      name[i] = in.next(); 
      age[i] = in.nextInt(); 
      email[i] = in.next(); 
     } 

     for(int i=0; i <= rec ; i++) 
     { 
      Students.add(new Student(std_id[i],name[i], age[i], email[i])); 
     } 
    } 
} 
+0

使用リストやベクトルを行うためにループのための1つを使用することは非常に十分です。 –

+0

リストを使用 student = new ArrayList (); –

+1

従来のアレイを使用することは必須ですか? Arraylist、Vectorなどのような多くのリストの実装を見つけることができるコレクションapiをチェックしてください。 –

答えて

0

使用次の行だけで、ユーザーからのrecの値を読んだ後:後

std_id = new int[rec]; 
name = new String[rec]; 
age = new int[rec]; 
email = new String[rec]; 

を完全に補正されたコード:

public class Input { 
    private int[] std_id;// initiating 20 size 
    private String[] name; 
    private int[] age; 
    private String[] email; 

    Scanner in = new Scanner(System.in); 

    private final List<Student> Students = new ArrayList<Student>(); 

    public Input() 
    { 
     initInput(); 
    } 

    public void initInput() 
    { 
     int rec; 
     System.out.println("How many records do u want to enter:"); 
     rec = in.nextInt(); 

     std_id = new int[rec]; 
     name = new String[rec]; 
     age = new int[rec]; 
     email = new String[rec]; 

     for(int i=0 ; i < rec; i++) 
     { 
      std_id[i] = in.nextInt(); 
      name[i] = in.next(); 
      age[i] = in.nextInt(); 
      email[i] = in.next(); 
     } 

     for(int i=0; i < rec ; i++) 
     { 
      Students.add(new Student(std_id[i],name[i], age[i], email[i])); 
     } 
    } 
} 

:ループを使用しているときに、ドン」間違ったインデックスを使用しているためにi <= recを使用すると、ArrayIndexOutOfBoundsExceptionが表示されます。代わりにi < recを使用してください。

int rec; 
System.out.println("How many records do u want to enter:"); 
rec = in.nextInt(); 

std_id = new int[rec]; 
age = new int[rec]; 
etc. 

そして上部にクラス変数から初期化を削除します:

public class Input {  
    private int[] std_id; 
    private String[] name; 
    etc. 
+0

本当に助けてくれた訂正ありがとう –

0

は配列を初期化します。あなたはそれらを必要としません。また

、あなたがレコードのrec数をしたい場合にはrec + 1記録になるので、0から<= recのないループを行うので、私はそれを行うための一般的な方法である、< recを使用するようにループを変更しました。

Javaの命名規則は、フィールド名を小文字で始めるため、Studentsの名前をstudentsに変更しました。

public class Input { 
    Scanner in = new Scanner(System.in); 

    private final List<Student> students = new ArrayList<Student>(); 

    public Input() 
    { 
     initInput(); 
    } 

    public void initInput() 
    { 
     System.out.println("How many records do u want to enter:"); 
     int rec = in.nextInt(); 

     for (int i = 0; i < rec; i++) 
     { 
      int std_id = in.nextInt(); 
      String name = in.next(); 
      int age = in.nextInt(); 
      String email = in.next(); 
      students.add(new Student(std_id, name, age, email)); 
     } 
    } 
} 
0

は、配列を取り除くあなたはRECの価値を知った後

+0

訂正してくれて本当に助けてくれました –

0

もう一つの解決策:

class Input { 
    private Scanner in = new Scanner(System.in); 
    private List<Student> list = new ArrayList<>(); 

    public Input() { 
     initInput(); 
    } 

    public void initInput() { 
     int rec; 
     System.out.println("How many records do u want to enter:"); 
     rec = in.nextInt(); 

     for (int i = 0; i < rec; i++) { 
      Student student = new Student(); 
      student.setId(in.nextInt()); 
      student.setName(in.next()); 
      student.setAge(in.nextInt()); 
      student.setEmail(in.next()); 
      list.add(student); 
     } 
     // this line to stop entering data 
     in.close(); 
     // this one just to show the result 
     list.forEach(s -> System.out.println("Student ID " + s.getId() + ", name: " + s.getName())); 
    } 
} 

コメント:

  • 代わりにリストを取り、配列を使用する必要はありません!余分な繰り返しを防ぐために、あなたのあなたが使用する必要がforループで
  • 「<」ではない「< =」
  • それはすべて
+0

別の方法をありがとう。しかし、私は参照が学生(すなわち、学生クラスのインスタンス)であるすべての学生オブジェクトの疑いがあります。したがって、基本的に生徒のオブジェクト参照のみがリストに格納されます?? 。もし私が間違っていれば私を修正してください。 –

+0

forループの繰り返しごとに、Student.class 'Student student = new Student();'の新しいインスタンスを作成し、フィールドを設定してこのインスタンスをリストに追加するよりも、 'list.add(student);'。 はい、すべてのインスタンスはStudent.classになり、 'list'には学生のみが含まれます。ユーザーの入力を忘れず、すべての生徒をリストに残します。 – Alex

関連する問題