Прочитать текстовый файл и вернуть массив объектов, который имеет несколько полей - PullRequest
0 голосов
/ 06 мая 2018

У меня есть текстовый файл, в котором каждая строка является экземпляром Movie, а поля объекта Movie разделены табуляцией. Мне нужно прочитать его и вернуть array объекта (каждой строки), который имеет несколько полей. Я не знаю, как сделать массив из объекта Movie (т.е. Movie[]) и return it.

Образец текстового файла, который я читаю:

id  title      price  

001 titanic    2

002 lady bird  3

Это то, что у меня так далеко.

public class Loader {
    //private String csvFile;
    private static final Resource tsvResource = new ClassPathXmlApplicationContext().getResource("classpath:movies.txt");
    private static InputStream movieIS = null;

    public Loader() {
        try {
            movieIS = tsvResource.getInputStream();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static Movie[] loadMovies() {

        BufferedReader br = null;
        String line = "";
        String[] tempArray = new String[100];
        int id;
        String title;
        String rating;
        String synopsis;
        String genre;
        String director;
        String[] actors;
        int price;
        int runtime;

        int index = 0;
        try {
            br = new BufferedReader(new InputStreamReader(movieIS));

            while ((line = br.readLine()) != null) {
                index++;
                String[] data = line.split("\\t");
                id = Integer.parseInt(data[0]);
                title = data[1];
                rating = data[2];
                synopsis = data[3];
                genre = data[4];
                director = data[5];
                actors = data[6].split(";");
                price = Integer.parseInt(data[7]);
                runtime = Integer.parseInt(data[8]);
            }
            String[] lines = new String[index];
            for (int i = 0; i < index; i++) {
                lines[i] = br.readLine();

            }


        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (br != null)
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }

        return;
     }
}

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Вы почти получили это. Вы можете создать объект Movie из полей, которые вы извлекли (например, title, rating, synopsis, actors и т. Д.) И добавить их в свой array.

Также я бы предложил вам использовать ArrayList вместо array для ваших фильмов (если вы не уверены в том, какое количество фильмов у вас будет)

Ваш loadMovies метод будет выглядеть следующим образом:

public static List<Movie> loadMovies() {

        // Initialize your movie list
        List<Movie> movieList = new ArrayList<>();

        String line = "", title, rating, synopsis, genre, director;
        int id, price, runtime, index = 0;
        String[] actors;

        try (BufferedReader br = new BufferedReader(new InputStreamReader(movieIS))) {

            while ((line = br.readLine()) != null) {
                index++;
                String[] data = line.split("\\t");
                id = Integer.parseInt(data[0]);
                title = data[1];
                rating = data[2];
                synopsis = data[3];
                genre = data[4];
                director = data[5];
                actors = data[6].split(";");
                price = Integer.parseInt(data[7]);
                runtime = Integer.parseInt(data[8]);

                // Create your Movie object here,
                // note that I'm using constructor here,
                // You can also use setters for optional fields as well
                Movie movie = new Movie(id, title, rating, synopsis, genre, director, actors, price, runtime);

                movieList.add(movie);
            }
            String[] lines = new String[index];
            for (int i = 0; i < index; i++) {
                lines[i] = br.readLine();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        //return movieList
        return movieList;
    }

Обратите внимание, что я также объединил объявления variable и try-catch в вашем исходном коде.

0 голосов
/ 06 мая 2018

сделать что-то вроде

 ArrayList <> al = new ArrayList<Movie>();

int index = 0;
try{
    br=new BufferedReader(new InputStreamReader(movieIS));


    while((line=br.readLine())!=null){
        index++;
        String[] data=line.split("\\t");
        id =Integer.parseInt(data[0]);
        title=data[1];
        rating=data[2];
        synopsis=data[3];
        genre=data[4];
        director=data[5];
        actors=data[6].split(";");
        price= Integer.parseInt(data[7]);
        runtime=Integer.parseInt(data[8]);
        Movie mv = new Movie();
        // load into mv
        al.add(mv);
       }
}

и возврат в конце, как это:

return al.toArray();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...