Как я могу записывать в файл, только если hashset не содержит этого значения?

#java #bufferedreader #contains #bufferedwriter

#java #bufferedreader #содержит #bufferedwriter

Вопрос:

У меня есть следующая функция, которая должна записывать в файл только в том случае, если объект не входит в набор StudentList.

Я использую метод contains . Я уже переопределил метод hashcode и equals в классе Student. Набор работает правильно и не имеет напечатанных дубликатов, но когда я перехожу к текстовому файлу, появляется несколько значений одной и той же записи.

Мой код для main:

 package fileproject;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;

public class FileManipulator {
    
    Set <Student> studentList = new HashSet<Student>();
    File file; 

    public void readData(String f) {
        try {
            //create a file
            file = new File(f);
            //instantiate the buffered 
            BufferedReader reader = new BufferedReader(new FileReader(file));
            String line;
            
            while((line = reader.readLine()) != null) {
                parseText(line);
            }
            reader.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
    }

    public void parseText(String line) {
        String [] student = line.split(",");
        Student s = new Student(Integer.parseInt(student[0]), student[1], student[2]);
        studentList.add(s);
    }
    
    public void display() {
        studentList.forEach(s -> System.out.println(s));
//      studentList.clear();
    }
    
    public void appendData(String f, Student s) {
        file = new File(f);
        if (studentList.contains(s)) return; //I expect this value to be true
        
        try {
            BufferedWriter writer = new BufferedWriter(new FileWriter(file, true));
            writer.newLine();
            writer.append(s.toString());
            writer.close();
            
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) {
        FileManipulator myFile = new FileManipulator();
        myFile.readData("students.txt");

        
        Student st = new Student(4, "Mo Dna", "Genetics");
        myFile.appendData("students.txt", st);
        myFile.readData("students.txt");
        
        myFile.display();
        
        System.out.println(myFile.studentList.contains(st)); //this should return true but returns false
        myFile.studentList.forEach(s -> System.out.println(s));
    }
}

 

Что я делаю не так?

Комментарии:

1. где ваш список учащихся и как вы его вводите?

2. он находится в верхней части моего класса как Set <Student> studentList = new HashSet<Student>();

3. при записи нового объекта student в file вам нужно добавить этого студента в свой список студентов.

4. Я отредактирую свой пост, чтобы он содержал весь файл класса для дальнейшего уточнения

5. Ваша appendData функция добавляет ваши данные, поэтому вы будете дублировать их.