0

.txtファイルを読み取り、学生のデータを抽出してコレクションに保存するプログラムを作成しています。次に、ユーザーはいくつかの異なるクエリを選択できるはずです。私が助けを求めているクエリは、たとえば 2014 年に卒業するすべての学生を選択し、これらの結果を画面に出力することです。

要するに、たとえば 2014 年に卒業する学生のクラスにArraylist保存されているスローを検索するにはどうすればよいですか? ProcessRecords何らかの理由で、特定の年に卒業した学生の記録を返すことができないようです。

以下は私のコードです。

最初のクラス: ProcessRecords (メイン メソッドを使用)

import java.util.*;
import java.io.*;

 public class ProcessRecords {

public static void AskUser()
throws Exception {
    Scanner preference = new Scanner(System.in);
    //Creating a new scanner will allow us to gather user input

    boolean flag=true; 
    //I will use this for my while loop
    while (flag) {
        System.out.println("What type of Search would you like to run?\n 1)Search for all students\n 2) Search for students graduating in a specific year\n 3)Search for students whose last name begins with a certain string\n");
        int searchType=preference.nextInt();
        //This variable will store what type of query the user would like to run

        switch(searchType) {
            case 1:
            System.out.println("Gathering Records for all students\n");
            //Call Query Method in the Query Class to return all students in the collection
            break;
            //Call Query Method in the Query Class to return all students in the colletion
            case 2: System.out.println("What graduation year would you like to search for? \n"); 
            String yearsearch=preference.next(); 
            query.getYear(Integer.parseInt(yearsearch));
            //getYear();
            break;
            //Call Query Method to return students who are graduating in the specified year
            //Pass the "yearsearch" variable to the Query class
            case 3:
            System.out.println("What string would you like to search for? \n");
            String lstsearch=preference.next();
            break;
            default:
            System.out.println("Please pick a number between 1 and 3") ;
            break;
            //Call Query Method in the Query Class to return students who have the string in their last name
            //Also I need to pass the "lstsearch" variable to the Query class to search through last names                

        }
    }
}

public static void main(String[] args)
throws Exception
{
    Scanner input = new Scanner(new File("students.txt"));
    //This will import the file
    input.nextLine();
    //This will skip the headers in the file
    System.out.println("Processing file now...");
    //Let the user know that the file is being processed

    int id;
    String last;
    String first;
    int year;
    int i=1;
    // Declare variables that we will extract from the file

    //Now we will being processing the file with a while loop

    List<StudentRecord> studentRecords = new ArrayList<StudentRecord>();
    while(input.hasNext())
    {
        id=input.nextInt();
        last=input.next();
        first=input.next();
        year=input.nextInt();
        StudentRecord record = new StudentRecord(id, last, first, year);
        studentRecords.add(record);
        System.out.println(id + "  " + last + "  " + first + "  " + year + "\n");

    }
    System.out.println(" You have successfully read and printed from the file!");
    for (StudentRecord s : studentRecords)
        System.out.println(s.toString());

    Query query = new Query(studentRecords);
  }
}

2 番目のクラス: StudentRecord

import java.util.*;
public class StudentRecord
{
private int id;
private String last;
private String first;
private int year;

public StudentRecord(int id, String last, String first, int year)
{
    this.id=id;
    this.last=last;
    this.first=first;
    this.year=year;
}

public String toString()
{
    return id + "  " + last + "  " + first + "  " + year;
} 

public int getYear()
{

    return year;
}

3 番目のクラス: クエリ

import java.util.*;
import java.io.*;

public class Query
{
private List<StudentRecord> records;

public Query(List<StudentRecord> records) {
    this.records = records;
}

public void getYear(int yearSearch) {
    //I am trying to create a method to get students who are graduating in a specific year.
    // I want to call this method in the ProcessRecord SwitchCase Case #2
    int count = 0;

    for(StudentRecord record : records) {
        if(record.getYear() == yearSearch) {
           System.out.println(record.toString());
            count++;
        }
    }


}
}

質問

Arraylist特定の年に卒業する学生の学生記録を検索し、行全体を画面に出力する方法を理解するのを手伝ってくれれば、素晴らしいことです! 私はプログラミングに非常に慣れていないので、あなたが私に提供できるすべての助けに感謝します.

4

2 に答える 2

1
public void getYear(int yearSearch) {
//I am trying to create a method to get students who are graduating in a specific year.
// I want to call this method in the ProcessRecord SwitchCase Case #2
int count = 0;

for(StudentRecord record : records) {
    if(record.getYear() == yearSearch) {
       System.out.println(record.getId()+" " + record.getFirst()+ " "+ record.getLast() + "+record.getYear());
        count++;
    }
}
}
于 2013-05-09T13:01:04.600 に答える
0

コードを IDE に挿入したところ、いくつかの点が気になりました。あなたの質問に記載されているコードから始めたので、コメントで既に説明したことをいくつか言うかもしれません。

まず、正しいクラスがインポートされていることを確認してください。3 つのクラスがすべて同じパッケージにある場合、インポートは必要ありません。また、クラスが正しいパッケージに含まれていることを確認してください。ファイルをフォルダーに配置するだけでは不十分です。importステートメントの上に、次のようなものが必要です。

package querytestproject;

import java.io.File;
...

これが完了すると、3 つのクラスすべてが他の 2 つのクラスを認識し、それに対して何かを行うことができます。

次に起こる最初のことは、ここにあります:

case 2:
System.out.println("What graduation year would you like to search for? \n");
String yearsearch = preference.next();
query.getYear(Integer.parseInt(yearsearch)); // <------------

queryまだ知られていません。まだインスタンス化していません。AQueryは、生徒のリストを検索するのに役立つオブジェクトです。それを達成するには、その Query-object にレコードのリストを与える必要があります。-メソッドで行いmainます。そこに Query-object を正しく作成します。しかし、ここで小さな問題があります。

main-method で行うQuery query = new Query(studentRecords);場合、query-object をローカルでインスタンス化します。つまり、クエリ オブジェクトは、それが作成されたメソッド内でのみ使用できますmain。したがって、 を実行するAskUserと、queryそれは不明です。

これを解決するには (queryグローバルにするのが解決策です)、メソッドqueryではなくクラスでインスタンス化します。

public class ProcessRecords  {

    Query query;

    public static void AskUser()
    ...

method の最後で、次のようmainに置き換えQuery query = new Query(studentRecords);ます。

query = new Query(studentRecords);

静的メソッド ( ) で非静的オブジェクトにアクセスしようとしているため、エラーが表示されますstatic main

静的な main メソッドは、このクラスから作成されたすべてのオブジェクトに main メソッドが 1 つしかないことを意味します。また、クラスをインスタンス化せずに main メソッドを呼び出し、このメソッドをクラスの名前で直接呼び出すことができます。static として宣言されているクラスのすべてのインスタンス変数とメソッドは、グローバル変数またはグローバル メソッドです。また、変数の前にクラス名を置き、ドット演算子の間にメソッド名を置くことで、クラスからオブジェクトを作成せずにそれらを直接呼び出すことができます。

queryしたがって、次のようにオブジェクトを作成します。

static Query query;

ファイルを実行すると、ファイルが正しく読み取られていることがわかります。しかし、その後、プログラムは停止します。のすべてのコード行をmain見ていくと、 への参照がありませんAskUser。メソッドですべてを設定しmainたら、ユーザーに何を求めているかを尋ねます。mainメソッドでは:

...
query = new Query(studentRecords);
AskUser();

コードの残りの部分は正しいです。query生徒のリストが正しくロードされ、ファイルから読み取られます。queryすべての生徒が含まれます。そのため、年を検索すると、 を呼び出すことによってロードしたばかりの学生のリストが検索されquery.getYear(x)ます。

于 2013-05-09T12:09:25.687 に答える