Моя функция обновления файлов повторяет цикл в два раза чаще, чем следовало бы, и элемент, на котором она выполняется, всегда является последним элементом

#java #file #oop #inheritance #vector

#Ява #файл #ООП #наследование #вектор

Вопрос:

Я пишу код, который обновляет файл после каждого изменения, список, из которого он берется, является статическим списком (примечание: раньше он не был статичным, но ошибка все равно произошла). Я использовал флаги, которые показывают мне текущее количество (и размер, если это каким-то образом изменится), но все казалось нормальным. В чем может быть причина этого? Обновление файла было установлено в значение true, и цикл добавлял последний элемент несколько раз. Когда значение обновления файла было изменено на false, цикл переписал весь файл в последний элемент (примеры обоих будут опубликованы ниже).

Класс с методом обновления:

  import java.io.*; import java.util.*;     public class Users {    //Protected variables   protected String NAME, ID, PASS, DEP;  //Global list   protected static List globalList = new List ();      //default constructor for Users  public Users () {    NAME = "";  ID = "";  PASS = "";  DEP = "";   }    //Full constructor for Users  public Users (String name, String id, String pass, String dep) {    this.NAME = name;  this.ID = id;  this.PASS = pass;  this.DEP = dep;    }        //Parent method meant to be overridden in child classes  public boolean authenticate(String a, String b) throws IOException {return false;}     //Used to update the files after every change  protected void update () {    //Three strings to store full lines for the file  String full1 = "", full2 = "", full3 = "";    //count variable to be incremented to access different objects in instructors  int count1 = 0;    //Iterator iterates the vector by amount of objects in it  Iterator it1 = globalList.InstructorList.iterator();    //while iterator has next object  while (it1.hasNext()amp;amp; count1 lt; globalList.InstructorList.size() ) {    //Goes to global list and accesses the instructor list with the element at count, using the iterator here might also work  String name = ""   globalList.InstructorList.elementAt(count1).getName()   "t";  String id = " t"   globalList.InstructorList.elementAt(count1).getId()   "t";  String pass = " t"   globalList.InstructorList.elementAt(count1).getPassword()   "t";  String dep = " t"   globalList.InstructorList.elementAt(count1).getDep()   "t";  String courses = " t"   globalList.InstructorList.elementAt(count1).getCourses()   "t";   count1  ;    //stores the string in full 1  full1  = name   id   pass   dep   courses   "1n";  }    //Same concept as above  count1 = 0;  Iterator it3 = globalList.StudentList.iterator();  while (it3.hasNext() amp;amp; count1 lt; globalList.StudentList.size()) {    String name = ""   globalList.StudentList.elementAt(count1).getName()   " t";  String id = " t"   globalList.StudentList.elementAt(count1).getId()   " t";  String pass = " t"   globalList.StudentList.elementAt(count1).getPassword()   " t";  String dep = " t"   globalList.StudentList.elementAt(count1).getDep()   " t";  String courses = " t"   globalList.StudentList.elementAt(count1).getCourses()   " t";     System.out.println ("The count in Student list is now: "   count1);  System.out.println ("The capa in Student list is now: "   globalList.StudentList.capacity());  System.out.println ("The size in Student list is now: "   globalList.StudentList.size());      full2  = name   id   pass   dep   courses   "2n";  count1  ;  }    //Same concept as above  count1 = 0;  Iterator it5 = globalList.CourseList.iterator();  while (it5.hasNext() amp;amp; count1 lt; globalList.CourseList.size()) {    String dep = " t"   globalList.CourseList.elementAt(count1).getDep()   " t";  String code = " t"   globalList.CourseList.elementAt(count1).getCode()   " t";  String name = " t"   globalList.CourseList.elementAt(count1).getName()   " t";  String section = " t"   globalList.CourseList.elementAt(count1).getSection()   " t";  String time = " t"   globalList.CourseList.elementAt(count1).getTime()   " t";  String roomnum = " t"   globalList.CourseList.elementAt(count1).getRoomNum()   " t";  String instruct = " t"   globalList.CourseList.elementAt(count1).getInstruct()   " t";  String strt = " t"   globalList.CourseList.elementAt(count1).getStrtDate()   " t";  String endt = " t"   globalList.CourseList.elementAt(count1).getEndDate()   " t";  String crdhr = " t"   globalList.CourseList.elementAt(count1).getCrdHours()   " t";  String reg = " t"   globalList.CourseList.elementAt(count1).getRegisterStd()   " t";  String curr = " t"   globalList.CourseList.elementAt(count1).getCurrentStds()   " t";  String max = " t"   globalList.CourseList.elementAt(count1).getMaxStds()   " t";         full3  = dep   code   name   section   time   roomnum   instruct   strt   endt   crdhr   reg   curr   max   "3n";  count1  ;  }      try {  //The false makes sure the file gets overwritten every time its updated  PrintWriter fileout1 = new PrintWriter(new FileOutputStream(new File("Instructors.txt"),true));  PrintWriter fileout2 = new PrintWriter(new FileOutputStream(new File("Students.txt"),true));  PrintWriter fileout3 = new PrintWriter(new FileOutputStream(new File("Courses.txt"),true));  fileout1.println(full1);  fileout2.println(full2);  fileout3.println(full3);  fileout1.close();  fileout2.close();  fileout3.close();    }        catch (IOException e1)  {  e1.printStackTrace();  }  }   }  

Один из файлов, установленный в значение true, до и после запуска в классе драйверов:

До:

ПОЛЬЗОВАТЕЛЬ1 1234 5678 КОМПЬЮТЕРНЫЙ КУРС1 нуль нуль нуль

ПОЛЬЗОВАТЕЛЬ2 2939 2428 БИЗНЕС-ноль ноль ноль ноль

ПОЛЬЗОВАТЕЛЬ3 2094 2480 ХИМИЧЕСКИЙ нуль нуль нуль нуль

После:

ПОЛЬЗОВАТЕЛЬ1 1234 5678 КОМПЬЮТЕРНЫЙ КУРС1 нуль нуль нуль

ПОЛЬЗОВАТЕЛЬ2 2939 2428 БИЗНЕС-ноль ноль ноль ноль

ПОЛЬЗОВАТЕЛЬ3 2094 2480 ХИМИЧЕСКИЙ нуль нуль нуль нуль ПОЛЬЗОВАТЕЛЬ3 2094 2480 ХИМИЧЕСКИЙ нуль нуль нуль нуль 2

ПОЛЬЗОВАТЕЛЬ3 2094 2480 ХИМИЧЕСКИЙ нуль нуль нуль нуль 2

ПОЛЬЗОВАТЕЛЬ3 2094 2480 ХИМИЧЕСКИЙ нуль нуль нуль нуль 2

Один из файлов, установленный на false, до и после запуска класса драйвера:

До:

ПОЛЬЗОВАТЕЛЬ1 1234 5678 КОМПЬЮТЕРНЫЙ КУРС1 нуль нуль нуль

ПОЛЬЗОВАТЕЛЬ2 2939 2428 БИЗНЕС-ноль ноль ноль ноль

ПОЛЬЗОВАТЕЛЬ3 2094 2480 ХИМИЧЕСКИЙ нуль нуль нуль нуль

После:

ПОЛЬЗОВАТЕЛЬ3 2094 2480 ХИМИЧЕСКИЙ нуль нуль нуль нуль

ПОЛЬЗОВАТЕЛЬ3 2094 2480 ХИМИЧЕСКИЙ нуль нуль нуль нуль

ПОЛЬЗОВАТЕЛЬ3 2094 2480 ХИМИЧЕСКИЙ нуль нуль нуль нуль

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

1. Вы никогда не звоните next на свой Iterator s, которым вы вообще не пользуетесь.

2. Они далее находятся внутри цикла while, разве это не считается? Куда же мне его тогда девать? @tgdavies

3. Ты звонишь hasNext , но никогда не звонишь next . Но вы не используете итераторы, поэтому вы можете просто удалить их.

4. //The false makes sure the file gets overwritten every time its updated но ты проходишь мимо true .

5. 1) Будет ли лучше использовать next на итераторе вместо подсчета int? 2) Вы правы, спасибо, хотя ошибка все еще присутствует в другой форме даже после изменения. Я исправлю вопрос сейчас, чтобы показать. @tgdavies