2016-12-28 3 views
-4

У меня есть JTextfield в моем коде, где я попрошу пользователя ввести идентификационный номер. После ввода идентификационного номера этот код будет смотреть, находится ли введенный идентификационный номер в файле grade.txt (файл, который я создал). Если введенный идентификационный номер находится в текстовом файле, он отобразит оценки пользователя. Когда я запускаю эту программу и вводят другой идентификационный номер, он отображает тот же класс первой строки (идентификационный номер). Мне нужна ваша помощь, как я могу это кодировать.Структура управления в Java

@Marcx здесь полный код:

/* 
* To change this license header, choose License Headers in Project Properties. 
* To change this template file, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package student_grade; 

import java.util.*; 
import java.io.*; 
import java.awt.Component; 
import javax.swing.JOptionPane; 
import javax.swing.JTextField; 
/** 
* 
* @author Christian 
*/ 
public class Student_grade { 
    public static void main(String[] args) throws FileNotFoundException { 


//declaration 
String firstName, lastName, discard; 
double subject1, subject2, subject3, subject4, subject5; 
long userID = 0; 


//get file from the address 
Scanner inFile= new Scanner(new FileReader("D:\\grade.txt")); 
    HashMap<Double, student> map = new HashMap<Double, student>(); 
    while (inFile.hasNext()) 
    { 
     student s = new student(); 
     s.id = inFile.nextDouble();   
     s.subject1 = inFile.nextDouble(); 
     s.subject2 = inFile.nextDouble(); 
     s.subject3 = inFile.nextDouble(); 
     s.subject4 = inFile.nextDouble(); 
     s.subject5 = inFile.nextDouble(); 
     map.put(s.id, s); 
    } 
    student student = map.get(userID); 

//JTextField 
JTextField fullName = new JTextField(); 
JTextField section = new JTextField(); 
JTextField idnumber2 = new JTextField(); 
Object[] message = 
{ 
    "Name:", fullName, 
    "Section:", section, 
    "ID Number:", idnumber2 
}; 
Component parent = null; 
int option = JOptionPane.showConfirmDialog(parent, message, "Check your Grades!", JOptionPane.OK_CANCEL_OPTION); 
//display information 
if (option == JOptionPane.OK_OPTION) 
    { 
    String value1 = fullName.getText(); 
    String value2 = section.getText(); 
    String value3 = idnumber2.getText(); 
      String outputStr= "Name: "+ fullName.getText() + 
       "\nSection: "+ section.getText()+ 
       "\nID Number: "+ student.id + 
       "\nMath: "+ student.subject1 + 
       "\nEnglish: "+ student.subject2 + 
       "\nFilipino: "+ student.subject3 + 
       "\nReligion: "+ student.subject4 + 
       "\nComputer: "+ student.subject5; 

    JOptionPane.showMessageDialog(null, outputStr,"User Information",JOptionPane.INFORMATION_MESSAGE); 
    } 
//closing main arguments 
                     } 
                 }  
+1

Вы, кажется, просто хватаете первый набор чисел в файле, поэтому, конечно, он отображает только оценки первого ученика. – Carcigenicate

+0

Можете ли вы мне помочь, как мне это сделать? Я только начинаю изучать Java, поэтому мне это очень сложно. –

+0

Прочитайте содержимое файла, найдите его, чтобы найти имя, которое вы ищете, затем возьмите цифры, которые появляются после него. – Carcigenicate

ответ

0

Вам нужно перебрать файл и искать идентификатор студента, который соответствует тому, введенному пользователю.

Каждый раз вы можете читать и прокручивать файл, или вы можете использовать структуру для «хранения» содержимого для последующего использования.

Если вы хотите «сохранить» содержимое файла, вы можете использовать HashMap.

Создайте класс Student, который будет использован для сохранения необходимой информации.

public class Student{ 
    public Double id; 
    public Double subject1; 
    public Double subject2; 
    public Double subject3; 
    public Double subject4; 
    public Double subject5; 
} 

В вашем главном классе вы можете

Scanner inFile = new Scanner(new FileReader("D:\\grade.txt")); 
    HashMap<Double, Student> map = new HashMap<Double, Student>(); 
    while (inFile.hasNext()) 
    { 
     Student s = new Student(); 
     s.id = inFile.nextDouble();   
     s.subject1 = inFile.nextDouble(); 
     s.subject2 = inFile.nextDouble(); 
     s.subject3 = inFile.nextDouble(); 
     s.subject4 = inFile.nextDouble(); 
     s.subject5 = inFile.nextDouble(); 
     map.put(s.id, s); 
    } 

Тогда вам нужно получить UserID введенного и получить Student объект из HashMap

Student student = map.get(userID); 

Затем вы можете распечатать/показать классы, просто называя объект student

String outputStr= "Name: "+ fullName.getText() + 
       "\nSection: "+ section.getText() + 
       "\nID Number: "+ student.id + 
       "\nMath: "+ student.subject1 + 
       "\nEnglish: "+ student.subject2 + 
       "\nFilipino: "+ student.subject3 + 
       "\nReligion: "+ student.subject4 + 
       "\nComputer: "+ student.subject5; 

Вам нужно настроить эти сниппет в ваш код ..

Если вы не хотите использовать HashMap и прочитать файл каждый раз, просто получить идентификатор перед время и во время проверки цикла, если ID равно по одному в каждой строке.

+0

@Marchx Сэр, я попробовал поставить «Student student = map.get (userID);» но он говорит, что он не может найти символ? как я могу это исправить? спасибо –

+0

Вам нужно объявить 'long UserID = xxx', где' xxx' - это идентификатор, введенный самим пользователем – Marcx

+0

Я объявлял long UserID = 0; но я получаю сообщение об ошибке «Исключение в потоке» main «java.lang.NullPointerException \t at student_grade.Student_grade.main (Student_grade.java:59) C: \ Users \ Christian \ AppData \ Local \ NetBeans \ Cache \ 8.2 \ executor-snippets \ run.xml: 53: Java возвращается: 1 BUILD FAILED (общее время: 9 секунд) 'после размещения имени, раздела и идентификационного номера –

Смежные вопросы