2013-05-07 87 views
0

我正在构建一个程序来读取.txt文件并提取学生数据并将其存储在一个集合中。那么用户应该能够选择几个不同的查询。我要求帮助的查询是选择所有毕业的学生,​​例如2014年,然后将这些结果打印到屏幕上。通过不同类别的Arraylist调用和搜索

简而言之,我如何搜索存储在ProcessRecords类中的Arralist,例如,2014年毕业的学生?我只是不明白如何从不同的课程中调用它。

下面是我的代码:

头等舱:随着主要方法

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

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"); 
     Query query = new Query(studentRecords); 
     int searchType=preference.nextInt(); 
     //How would I throw an exception here if the user doesn't enter a number or enters a number less than 1 or great than 4 
     //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 colletion 
      case 2: 
      System.out.println("What graduation year would you like to search for? \n"); 
      String yearsearch=preference.next(); 
      //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(); 
      //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()); 
} 
} 


二等学生记录

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


第三类(一个我要求帮助的)

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

    public class Query 
{ 
    //public static ProcessRecords studentrecord = new ProcessRecords(); 
    private List<StudentRecord> records; 

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

    public int getYear(int yearSearch) { 
    int count = 0; 

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

     return count; 
    } 
    } 

增添了新的职位!

+0

你忘了? eak你的案例。如果'searchType'为1,则所有三种情况下的代码将被执行。 – 2013-05-07 06:37:18

+0

谢谢!有没有可能帮助我收集ListArray中的所有记录,以便在特定年份毕业的学生? – user2263142 2013-05-07 14:04:47

回答

0

你必须做出studentRecords静态变量或实例变量,

把它像这样,上述情况主要有:

public static List<StudentRecord> studentRecords ; 
public static void main(String[] args) 
throws Exception{ 

studentRecords = new ArrayList<StudentRecord>(); 

然后就这样称呼它:

ProcessRecords.studentRecords 
0

您的代码有多个问题。

  1. 公共变量气馁,getter/setter方法应被用来访问对象的成员。 Eclipse alt+s, r会为你生成它们

  2. 你的变量名称是误导性的。您在Query中访问的列表是什么?

  3. 你的类的名字也是(至少!)误导。 ProcessRecords作为一个行动,特别是似乎不好。在这种情况下,班级不应该是名词,比如RecordsProcessor?它不应该暗示它实际在做什么吗? StudentYearSearcher

  4. 您不会抛出该列表,而是将它作为参数传递(它是引用),或者以某种方式访问​​它。你抛出异常

回答你的问题

有多种方法可以做到这一点。一种方法是使用单例模式并使列表静态可访问。就像这样:

class StudentRecord { 
    static List<StudentRecord> studentRecords; 

    List<StudentRecord> getStudentRecords() { 
    if (studentRecords == null) studentRecords= new ArrayList<StudentRecord>(); 
    return studentRecords; 
    } 

    //the reest of the class 
} 
0

最简单的解决办法是通过整个列表到getYear方法:

public static int getYear(List<StudentRecord> studentRecords, int yearsearch) { 
     // ProcessRecords processRecords = new ProcessRecords(); <- don't need it 
     int getYear= yearsearch; 
     Iterator itr = studentRecords.iterator(); 

     // ... 
0

让你的查询类是这样的:

public class Query { 

    private List<StudentRecord> records; 

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

    public int getYear(int yearSearch) { 
     int count = 0; 

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

     return count; 
    } 

    public int otherQuery() { 
     // code for another query 
    } 
} 

然后在你的主等级:

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

public class ProcessRecords { 

    public static void AskUser(Query query) throws Exception { 
     // all the code you have right now except the line where you 
     // create a new Query object 
    } 

    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); // we've moved this out of AskUser method to here 

     // now we call the AskUser method and pass it this query object we just 
     // created so it can have access to it, meaning inside the AskUser method we can 
     // say things like 'query.getYear(2014);' 

     AskUser(query); 
    } 
} 
+0

为什么在编译ProcessRecords类时找不到符号-Variable StudentRecords?我在上次编辑中更新了代码 – user2263142 2013-05-07 06:47:50

+0

AskUser()方法中不存在studentRecords变量您需要创建Query对象而你可以访问studentRecords列表,你可以在main中创建列表之后(在整个循环之后)做到这一点,或者你可以让studentRecords成为一个实例变量并以此方式访问它,或者你可以使查询对象是一个实例变量,你也可以在AskUser()中访问它。 – 2013-05-07 06:54:09

+0

再次查看你的代码最简单的方法可能是将查询对象传递给AskUser方法。在你建立了studentRecords变量之后(在你的成功消息的正上方或下方),你必须将AskUser改为“public static void AskUser(Query query)”。 – 2013-05-07 07:02:18