2015-11-27 3 views
1

Я пытаюсь заполнить ArrayList данными, хранящимися в текстовом файле, данные представляют собой 5 разных значений, разделенных пробелом, и сочетание логических строк и целых чисел. Кроме того, я использую BlueJ, не уверен, что это что-то меняет.Java Read File Class, не создающий arraylist

Когда данные считываются из файла, объекты типа номера должны быть создан на основе этих данных

Я новичок в Java, я только начал изучать его в течение последних нескольких недель, мои данные для чтения класс выглядит следующим образом:

Комната данных класс:

public class RoomData 
{ 
    //Default Values of a Room 
    private int roomNumber = 0; 
    private int bookingNights = 0; 
    private boolean hasEnSuite = false; 
    private boolean isBooked = false; 
    private String bookingName = "<None>"; 

    public void setRoomNumber(int roomNumber) 
    { 
     this.roomNumber = roomNumber; 
    } 

    public void setBookingNights(int bookingNights) 
    { 
     this.bookingNights = bookingNights; 
    } 

    public void setHasEnSuite() 
    { 
     this.hasEnSuite = hasEnSuite; 
    } 

    public void setIsBooked() 
    { 
     this.isBooked = isBooked; 
    } 

    public void setBookingName() 
    { 
     this.bookingName = bookingName; 
    } 
    } 

ReadDataClass:

public class ReadHotelData 
{ 
    private String filePath; 

    public ReadHotelData() 
    { 
     filePath = "hotelData.txt"; 
    } 

    private List<RoomData> list = new ArrayList <>(); 

    public boolean hasNext() throws FileNotFoundException 
    { 
     Scanner s = new Scanner(new File("hotelData.txt")); 

     while (s.hasNext()) 
     { 
      String nextLine = s.nextLine(); //reads text file line by line 
      RoomData roomData = new RoomData(); 

      String[] values = nextLine.split(" "); // splits the text file by white space 

      roomData.setRoomNumber(Integer.parseInt(values[0])); 
      roomData.setBookingNights(Integer.parseInt(values[1])); 

      roomData.setHasEnSuite(Boolean.parseBoolean(values[2])); 
      roomData.setIsBooked(Boolean.parseBoolean(values[3])); 

      roomData.setBookingName(String.parseString(values[4])); 

      list.add(roomData); 
     }// end loop 
     s.close(); 
     return true; 
    } 

    public List <RoomData> getRoomDataList() 
    { 
     return list; 
    } 
} 

Как я уже сказал, я новичок, поэтому, если мне не хватать ничего, я бы очень признателен за любую помощь!

Пример данных, хранящихся в текстовом файле:

0 false David 0 false 
0 true John 0 false 
0 false Jim 0 true 
+1

Итак, с чем вы столкнулись? –

+0

Я хочу, чтобы arraylist создавался при запуске кода, arraylist хранится в другом классе под названием «Hotel» [ссылка] (http://imgur.com/93poXZA), как мой проект в настоящее время находится – Aaranihlus

+0

Вы хотите прочитайте каждую строку в элементе списка? Код, который вы уже прочитали все токены в arraylist, вам нужен метод getter, который возвращает его, чтобы вы могли использовать его в любом месте. – A4L

ответ

1

Сначала нужно создать класс RoomData для хранения данных для каждой комнаты и дать каждой переменной значимое имя вместе с соответствующим типом.

Измени ArrayList провести этот тип вместо String

private List<RoomData> list = new ArrayList<>(); 

Читайте каждую строку, используя s.nextLine()

while(s.hasNext()) 
{ 
    String nextLine = s.nextLine(); 
    RoomData roomData = new RoomData(); 

Создать экземпляр этого класса, split и анализировать каждое значение в соответствующей переменной в экземпляр RoomData, который вы создали.

String[] values = nextLine.split(" ") // split by space 
    // lets say you have "0 false David 0 false" 
    // values[0] would be "0" 
    // values[1] would be "false" 
    // values[2] would be "David" 
    // values[3] would be "0" 
    // values[4] would be "false" 

Все значения в values будет иметь тип String вам нужно будет преобразовать те из строки к типу вы определили в RoomData для Int вы можете использовать Integer.parseInt(String s), для булева есть подобный метод (Boolean .parseBoolean (String s)) [http://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html#parseBoolean-java.lang.String-], строковые значения могут быть установлены напрямую.

Добавить этот экземпляр в arraylist.

list.add(roomData); 

} // end of while 

Добавить метод получения, чтобы вернуть этот список для использования в других классах.

public List<RoomData> getRoomDataList() { 
    return list; 
} 
+0

Или создайте конструктор RoomData для разбора строки. – Robert

+0

@Robert, как бы я это сделал? – Aaranihlus

+0

@Aaranihlus Просто создайте конструктор, который берет строку, например 'public RoomData (строка строки)', а затем имеет код синтаксического анализа, подобный A4L, который показан выше, используя split и присваивая переменные-членам по мере необходимости. – Robert