簡體   English   中英

我如何在某個子字符串值之后收集所有內容

[英]how do i collect everything after a certain substring value

在這里,我想收集子字符串后的所有內容並將其設置為特定字段。

import java.util.ArrayList;
import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;

/**
 * 
 *
 * class StudentReader for retrieveing data from file
 * 
 */
public class StudentReader {
  
  public static Student[] readFromTextFile(String fileName) { 
      ArrayList<Student> result = new ArrayList<Student>();   
      File f = new File(filename);                            
      Scanner n = new Scanner(f);                             
      while (n.hasNextLine()) {                               
            String text = n.nextLine();                       
      }                                                       
      n.close();                                              
                                                              
      String hold1[] = text.Split(",");                       
      String hold2[] = new String[hold1.length];;             
      for(int i = 0; i < hold1.length(); ++i) {               
          hold2[i] = hold1.Split("=");                        
          if (hold2[i].substring(0,3).equals("name")) {       
                                                              
          }                                                   
      }                                                       
      return result.toArray(new Student[0]);                                  
   }
}

備份這段代碼的目標是首先打開並讀取一個文件,其中大約有 20 行,看起來就像這個 Student{name=Jill Gall,age=21,gpa=2.98} 然后我需要像上面那樣拆分它,首先兩次擺脫逗號和等號,然后我需要為每一行收集名稱,年齡和雙精度的值,解析它們,然后將它們設置為新的學生對象並返回它們將要成為的數組保存到,我目前堅持的是,我無法弄清楚這里收集“姓名”“年齡”“gpa”之后的所有內容的正確代碼是什么,因為我不知道如何使用此鏈接為不同的姓名設置特定的子字符串作為參考,但我不明白它實際上是做什么的

如何實現Scanner的隨意使用

我認為錯誤在於以下幾行,

while (n.hasNextLine()) {                               
   String text = n.nextLine();                       
}    

上面的代碼應該在String hold1[] = text.Split(",");處拋出編譯錯誤String hold1[] = text.Split(","); 因為 text 是 while 循環中的局部變量。

實際應該是

List<String> inputs = new ArrayList<String>()
Scanner n = new Scanner(f);                             
while (n.hasNextLine()) {                               
   inputs.add(n.nextLine());
} 

您可以使用上面的inputs列表來操作您的邏輯

從它的外觀來看,至少通過您的 ArrayList<> 聲明,您有一個名為Student的類,其中包含studentNamestudentAgestudentGPA 的成員變量實例。 它可能看起來像這樣( Getter/Setter方法當然是可選的,覆蓋的toString()方法也是如此):

public class Student {

    // Member Variables...
    String studentName;
    int studentAge = 0;
    double studentGPA = 0.0d;

    // Constructor 1:
    public Student() {  }

    // Constructor 2: (used to fill instance member variables 
    // right away when a new instance of Student is created)
    public Student(String name, int age, double gpa) { 
        this.studentName = name;
        this.studentAge = age;
        this.studentGPA = gpa;
    }

    // Getters & Setters...
    public String getStudentName() {
        return studentName;
    }

    public void setStudentName(String studentName) {
        this.studentName = studentName;
    }

    public int getStudentAge() {
        return studentAge;
    }

    public void setStudentAge(int studentAge) {
        this.studentAge = studentAge;
    }

    public double getStudentGPA() {
        return studentGPA;
    }

    public void setStudentGPA(double studentGPA) {
        this.studentGPA = studentGPA;
    }

    @Override
    public String toString() {
        return new StringBuilder("").append(studentName).append(", ")
                    .append(String.valueOf(studentAge)).append(", ")
                    .append(String.valueOf(studentGPA)).toString();
    }
    
}

我應該認為目標是從學生文本文件中讀取每個文件行,其中每個文件行由特定學生的姓名、學生的年齡和學生的 GPA 分數組成,並為該學生創建一個學生實例文件行。 這將一直進行到文件結束。 如果Student文本文件中有 20 個學生,那么當readFromTextFile()方法完成運行時,將有 20 個 Student 的特定實例。 您的StudentReader類可能如下所示:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 *
 * class StudentReader for retrieving data from file
 * 
 */
public class StudentReader {

    private static final Scanner userInput = new Scanner(System.in);
    private static Student[] studentsArray;
 
    public static void main(String args[]) {
        String underline = "=====================================================";
        String dataFilePath = "StudentsFile.txt";
        System.out.println("Reading in Student data from file named: " + dataFilePath);
        if (args.length >= 1) {
            dataFilePath = args[0].trim();
            if (!new File(dataFilePath).exists()) {
                System.err.println("Data File Not Found! (" + dataFilePath + ")");
                return;
            }
        }
        studentsArray = readFromTextFile(dataFilePath);
    
        System.out.println("Displaying student data in Console Window:");
        displayStudents();
        System.out.println(underline);
    
        System.out.println("Get all Student's GPA score average:");
        double allGPA = getAllStudentsGPAAverage();
        System.out.println("GPA score average for all Students is: --> " + 
                           String.format("%.2f",allGPA));
        System.out.println(underline);
    
        System.out.println("Get a Student's GPA score:");
        String sName = null;
        while (sName == null) {
            System.out.print("Enter a student's name: --> ");
            sName = userInput.nextLine();
            /* Validate that it is a name. Should validate in 
               almost any language including Hindi. From Stack-
               Overflow post: https://stackoverflow.com/a/57037472/4725875    */
            if (sName.matches("^[\\p{L}\\p{M}]+([\\p{L}\\p{Pd}\\p{Zs}'.]*"
                                + "[\\p{L}\\p{M}])+$|^[\\p{L}\\p{M}]+$")) {
                break;
            }
            else {
                System.err.println("Invalid Name! Try again...");
                System.out.println();
                sName = null;
            }
        }
        boolean haveName = isStudent(sName);
        System.out.println("Do we have an instance of "+ sName + 
                           " from data file? --> " + 
                           (haveName ? "Yes" : "No"));
        // Get Student's GPA 
        if (haveName) {
            double sGPA = getStudentGPA(sName);
            System.out.println(sName + "'s GPA score is: --> " + sGPA);
        }
        System.out.println(underline);
    }

    public static Student[] readFromTextFile(String fileName) {
        List<Student> result = new ArrayList<>();
        File f = new File(fileName);
        try (Scanner input = new Scanner(f)) {
            while (input.hasNextLine()) {
                String fileLine = input.nextLine().trim();
                if (fileLine.isEmpty()) {
                    continue;
                }
                String[] lineParts = fileLine.split("\\s{0,},\\s{0,}");
                String studentName = "";
                int studentAge = 0;
                double studentGPA = 0.0d;

                // Get Student Name (if it exists).
                if (lineParts.length >= 1) {
                    studentName = lineParts[0].split("\\s{0,}\\=\\s{0,}")[1];

                    // Get Student Age (if it exists).
                    if (lineParts.length >= 2) {
                        String tmpStrg = lineParts[1].split("\\s{0,}\\=\\s{0,}")[1];
                        // Validate data.
                        if (tmpStrg.matches("\\d+")) {
                            studentAge = Integer.valueOf(tmpStrg);
                        }

                        // Get Student GPA (if it exists).
                        if (lineParts.length >= 3) {
                            tmpStrg = lineParts[2].split("\\s{0,}\\=\\s{0,}")[1];
                            // Validate data.
                            if (tmpStrg.matches("-?\\d+(\\.\\d+)?")) {
                                studentGPA = Double.valueOf(tmpStrg);
                            }
                        }
                    }
                }
                /* Create a new Student instance and pass the student's data
                   into the Student Constructor then add the Student instance 
                   to the 'result' List.               */
                result.add(new Student(studentName, studentAge, studentGPA));
            }
        }
        catch (FileNotFoundException ex) {
            System.err.println(ex);
        }
        return result.toArray(new Student[result.size()]);
    }

    public static void displayStudents() {
        if (studentsArray == null || studentsArray.length == 0) {
            System.err.println("There are no Students within the supplied Students Array!");
            return;
        }
        for (int i = 0; i < studentsArray.length; i++) {
            System.out.println(studentsArray[i].toString());
        }
    }

    public static boolean isStudent(String studentsName) {
        boolean found = false;
        if (studentsArray == null || studentsArray.length == 0) {
            System.err.println("There are no Students within the supplied Students Array!");
            return found;
        } else if (studentsName == null || studentsName.isEmpty()) {
            System.err.println("Student name can not be Null or Null-String (\"\")!");
            return found;
        }
    
        for (int i = 0; i < studentsArray.length; i++) {
            if (studentsArray[i].getStudentName().equalsIgnoreCase(studentsName)) {
                found = true;
                break;
            }
        }
        return found;
    }

    public static double getStudentGPA(String studentsName) {
        double score = 0.0d;
        if (studentsArray == null || studentsArray.length == 0) {
            System.err.println("There are no Students within the supplied Students Array!");
            return score;
        } else if (studentsName == null || studentsName.isEmpty()) {
            System.err.println("Student name can not be Null or Null-String (\"\")!");
            return score;
        }
    
        boolean found = false;
        for (int i = 0; i < studentsArray.length; i++) {
            if (studentsArray[i].getStudentName().equalsIgnoreCase(studentsName)) {
                found = true;
                score = studentsArray[i].getStudentGPA();
                break;
            }
        }
        if (!found) {
            System.err.println("The Student named '" + studentsName + "' could not be found!");
        }
        return score;
    }

    public static double getAllStudentsGPAAverage() {
        double total = 0.0d;
        if (studentsArray == null || studentsArray.length == 0) {
            System.err.println("There are no Students within the supplied Students Array!");
            return total;
        } 
    
        for (int i = 0; i < studentsArray.length; i++) {
            total += studentsArray[i].getStudentGPA();
        }
        return total / (double) studentsArray.length;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM