2015-01-20 2 views
1

Первое назначение класса моих алгоритмов заключается в том, что мне нужно создать программу, которая читает серию названий книг из предоставленного CSV-файла, сортирует их, а затем печатает их вне. Назначение имеет очень специфические параметры, и один из них заключается в том, что мне нужно создать статический метод getList List (String file). Специфика того, что этот метод включает в себя следующее:Создание метода getList с файлом csv в качестве входного параметра

«Метод GetList должен данные читает из файла book.csv CSV Если строка не соответствует названию картины , автора, год, тому сообщение. должно быть записано в стандартный поток ошибок (см. примерный вывод). В следующей строке следует продолжить чтение программы . NO исключение должно быть выбрано. "

У меня нет большого опыта использования List, ArrayList или чтения в файлах, так как вы можете догадаться, что это очень сложно для меня. Вот то, что я до сих пор для метода:

public static List<Book> getList(String file) 
{ 
    List<Book> list = new ArrayList<Book>(); 

    return list; 
} 

В настоящее время, моя догадка, чтобы сделать цикл и создавать новый объект книги в список, используя I в качестве индекса, но я не знаю, как high, чтобы установить цикл, так как у меня нет способа рассказать программе, как, например, много строк в csv. Я также не знал бы, как заставить его различать название, автор и год каждой книги в csv.

Извините за нерешительный вопрос. Буду признателен за любую помощь. Благодарю.

+0

CSV-файл - это всего лишь текстовый файл. Вы можете использовать синтаксический анализатор CSV, или вы можете просто прочитать в каждой строке из файла, использовать 'String # split', чтобы разбить каждую часть, выполнить валидацию для заказа, создать из них объект« Book »(если они pass) и добавьте его в 'ArrayList'. Есть МНОГО примеров каждой части этого на этом сайте и просто выполняет поиск Google. – Ascalonian

+0

[Здесь] (http://stackoverflow.com/a/22074145/3315914) пример чтения файла по строкам. Вы можете создать конструктор для создания новой книги из строки, используя 'String.split (", ")'. – rpax

+0

Следующий вопрос ... будет ли файл содержать цитируемые строки, которые могут содержать запятую? Например, '' Awesome Book, The ''? – Ascalonian

ответ

2

Лучшим способом сделать это было бы чтение файла по строкам и проверка правильности формата строки. Если это правильно, добавьте новый объект в список с данными в строке, иначе напишите сообщение об ошибке и продолжите.

Вы можете прочитать ваш файл, используя BufferedReader. Они могут читать построчно, выполнив следующие действия:

 BufferedReader br = new BufferedReader(new FileReader(file)); 
     String line; 

     while ((line = br.readLine()) != null) { 
      // do something with the line here 

     } 
     br.close(); 

Теперь, когда у вас есть строки, вы должны убедиться, что они находятся в правильном формате. Простым методом для этого является разделение строки на запятую (так как это файл csv) и проверьте, что в массиве имеется как минимум 3 элемента. Вы можете сделать это с помощью метода String.split(regex).

String[] bookDetails = line.split(","); 

Это заполнило бы массив полями из вашего файла. Например, если первая строка была one,two,three, тогда массив будет ["one","two","three"].

Теперь у вас есть значения из строки, но вы должны убедиться, что она в правильном формате. Поскольку в вашем сообщении указано, что у него должно быть 3 поля, мы можем проверить это, проверив длину массива, который мы получили выше. Если длина меньше 3, мы должны вывести некоторое сообщение об ошибке и пропустить эту строку.

  if(bookDetails.length<3){ //title,author,year 
       System.err.println("Some error message here"); // output error msg 
       continue; // skip this line as the format is corrupted 
      } 

Наконец, поскольку мы прочитали и подтвердили, что необходимая информация есть и находится в допустимом формате. Мы можем создать новый объект и добавить его в список.Мы будем использовать обертку Integer, встроенную в Java, для анализа года в примитиве int типа для конструктора классов Book. Integer имеет функцию Integer.parseInt(String s), которая будет анализировать String на значение int.

list.add(new Book(bookDetails[0], bookDetails[1], Integer.parseInt(bookDetails[2]))); 

Надеюсь, это поможет вам и ответит на ваш вопрос. Полный метод, что мы сделали может быть следующим:

public static List<Book> getList(String file) { 
    List<Book> list = new ArrayList<Book>(); 

    try { 
     BufferedReader br = new BufferedReader(new FileReader(file)); 
     String line; 

     while ((line = br.readLine()) != null) { 
      String[] bookDetails = line.split(","); 
      if (bookDetails.length < 3) { // title,author,year 
       System.err.println("Some error message here"); 
       continue; 
      } 

      list.add(new Book(bookDetails[0], bookDetails[1], Integer.parseInt(bookDetails[2]))); 

     } 
     br.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    return list; 
} 

И если вы хотите, чтобы проверить это, метод main можно сделать с помощью следующего кода (это, как я тестировал).

public static void main(String[] args) { 
    String file = "books.csv"; 
    List<Book> books = getList(file); 
    for(Book b : books){ 
     System.out.println(b); 
    } 
} 

Чтобы проверить это, убедитесь, что у вас есть файл (шахта «books.csv») в корневом каталоге вашего Java проекта. Шахта выглядела как:

bob,jones,1993 
bob,dillon,1994 
bad,format 
good,format,1995 
another,good,1992 
bad,format2 
good,good,1997 

И с указанным выше основным методом, функцией GetList, и файлом, мой код генератор следующего выходные (примечание: сообщения об ошибках были в красном цвете для потока Std.err, так не показать цвета):

Some error message here 
Some error message here 
[title=bob, author=jones, years=1993] 
[title=bob, author=dillon, years=1994] 
[title=good, author=format, years=1995] 
[title=another, author=good, years=1992] 
[title=good, author=good, years=1997] 

Не стесняйтесь задавать вопросы, если вас путают на любой его части. Выведенный результат относится к методу toString(), который я написал в классе Book, который использовался для проверки кода в моем ответе.

+0

Это действительно отличный ответ, но есть несколько конфликтов с заданными параметрами задания. См., Сам файл определяется как String в параметрах метода, вероятно, введенный там из Сканера или что-то определенное в основном методе. Из того, что я могу сказать, класс BufferedReader не имеет возможности просто читать простую строку. Я вижу, что вы используете FileReader, но читаете ли он из самого файла String? –

+0

Другая проблема заключается в массиве bookDetails. См., Параметр for years - это int, что означает, что конструктор Book Book (String title, String author, int years). Однако bookDetails, поскольку он определен как массив строк, пытается поместить параметр years в качестве String, что означает, что он не может создать экземпляр. И насколько я могу судить, нет способа сделать String int int так, как мне это нужно. –

+0

В файле есть строка, вы имеете в виду, что это путь к файлу? Или все содержимое файла? «BufferedReader» - простой читатель IO, он должен иметь возможность читать строку, насколько мне известно. Что касается проблемы 'int', вы можете использовать функцию Integer.parseInt (String s). 'int' является примитивным типом, но' Java' имеет оболочку (например, Integer) вокруг примитивных типов для добавления функциональности. Итак, для конструктора книги вы можете использовать 'Integer.parseInt (bookDetails [2])' или любой другой индекс, в котором находится год. –

0

Вы можете использовать цикл while и прочитать его до конца файла. Каждая новая строка будет представлять деталь книги. В csv все детали разделены запятой, поэтому вы можете прочитать строку, и каждая запятая будет действовать как разделитель между атрибутами Book.

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