Чтение из текстового файла в несколько массивов JAVA - PullRequest
0 голосов
/ 05 мая 2011

Привет, у меня небольшая проблема с чтением из текстового файла в массивы.В моей программе он сохраняется с фильмами и актерами, а при сохранении создается текстовый файл с фильмами, а затем с актерами, причем каждый фильм и актер имеют отдельную строку.

Моя проблема возникает при попытке прочитать до момента, когда все фильмы попадают в массив фильмов, а все актеры - в массив актеров.Я попытался поместить запись (новую строку) в последний фильм в файле, а затем выполнить цикл while, пока строка не станет нулевой, чтобы затем завершить этот цикл и перейти к новому циклу для актеров до конца файла, но это неработа.

На самом деле я застрял, пытаясь заставить это работать, я новичок в Java, поэтому любая помощь будет признательна.

Заранее спасибо.

[EDIT]

Моя проблема в том, что все в файле объединяется в один массив, массив фильмов.Вместо этого я хотел бы, чтобы фильмы входили в массив фильмов, а актеры - в массив актеров.Ниже приведен мой код для сохранения и загрузки файла:

public void save(String fileName) throws FileNotFoundException {

    try {

        BufferedWriter writer = new BufferedWriter(new FileWriter(fileName));
        for ( int i = 0; i < nbrMovies; i++)
        {
        writer.write(movies[i].getName());
        writer.newLine();
        }

        writer.newLine();

        for (int n = 0; n < nbrActors; n++)
        {
            writer.write(actors[n].getFullName());
            writer.newLine();
        }

        writer.close();

    } catch(IOException ex) {
        ex.printStackTrace();
    }
}

public void load(String fileName) throws FileNotFoundException {

    try {
        BufferedReader reader = new BufferedReader(new FileReader(fileName));
        String line = null;
        while ((line = reader.readLine()) != null) {
            addMovie(line);
        }
        reader.close();


    } catch (Exception ex) {

        ex.printStackTrace();
    }

}

Еще раз спасибо :) [END EDIT]

[EDIT2]

Пример файла ниже:)

testmovie

testmovie2

Имя Имя Имя2 Имя2

[КОНЕЦ РЕДАКТИРОВАНИЯ2]

Ответы [ 7 ]

6 голосов
/ 05 мая 2011

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

movie:troy
movie:mission impossible
actor:brad pit
actor:tom cruse

это поможет вам идентифицировать фильм или актера. затем используйте этот код

FileReader fr=new FileReader("E:\\New folder\\myfile.txt");
BufferedReader br=new BufferedReader(fr);
String str=null;
while((str=br.readLine())!=null)
{
    if(str.contains("movie"))
    {
        //store it into movie array
    }else if(str.contains("actor"))
    {
        //store it into actor array
    }
}
5 голосов
/ 05 мая 2011

сначала создайте текстовый файл, в котором фильмы и актеры должны храниться в отдельной строке, к которой прикреплена строка идентификатора.как фильм: фильм Трой: актер невыполнимая миссия: актер Брэд Пит: Том Круз

это поможет вам определить фильм или актер, играющий за линию, а затем использовать этот код

    FileReader fr=new FileReader(filepath);
    BufferedReader br=new BufferedReader(fr);
    String str=null;
    while((str=br.readLine())!=null)
    {
        if(str.contains("movie"))
        {
            //store it into movie array
        }else if(str.contains("actor"))
        {
            //store it into actor array
        }
    }
2 голосов
/ 05 мая 2011

Вы можете сделать это, используя только один цикл while и счетчик.

int counter = 0;
while(end of file){
  if(counter%2 == 0){
    // Movie Names, Add to Movie array
  }else{
    // Actor Names, Add to Actor array
  }
}
1 голос
/ 05 мая 2011

Вам нужен разделитель между записями, и пустая строка должна помочь.Алгоритм чтения должен выглядеть следующим образом:

List<String> lines = getAllLinesFromFile();  // some magic
Map<String, List<String>> movies = new HashMap<String, List<String>>();

String actualMovieName = "";
for (String line : lines) {
   if (actualMovieName.isEmpty()) {
      // the actual line is movie name
      actualMovieName = line.trim();
      movies.put(actualMovieName, new ArrayList<String>());          
   } else {
      // the actual line is not a movie name
      String actor = line.trim();
      if (!actor.isEmpty() {
        // the actual line is an actor name
        movies.get(actualMovieName).add(line);
      } else {
        // the actual line is a separator (empty line)
        actualMovieName = "";
      }
   }
}

В конце у вас будет карта, где ключ - это название фильма (названия фильмов уникальны, надеюсь!), А значение - список актеров..

0 голосов
/ 05 мая 2011

Вам нужно найти условие (например, предложенную вами пустую строку), чтобы завершить цикл фильмов и затем запустить цикл актеров. Ожидание BufferedReader.readLine() == null не будет работать, потому что null возвращается только в конце потока.

boolean isMovie = true;
while ((line = reader.readLine()) != null)
{
   if(line.equals("")) {
      isMovie = false;
   }

   if(isMovie) {
      addMovie(line);
   } else {
      addActor(line);
   }
}

... альтернативно, более структурированный файл данных облегчит работу.

0 голосов
/ 05 мая 2011

Полагаю, ваш текстовый файл выглядит так:

START
Титаник
Аватар
Матрица

Киану Ривз
Джон Тровальта
Джонни Депп
END

Пока вы перечитываете строку за строкой (см. http://www.roseindia.net/java/beginners/java-read-file-line-by-line.shtml) проверьте наличие пустой строки, т. Е. "". В следующем цикле вы найдете актеров (создайте новый массив актеров отсюда.

Таким образом, забрать readLine Wont Вернуть ноль для новой строки, вместо этого она возвращает пустую строку ""

0 голосов
/ 05 мая 2011

Без кода или примера того, как выглядит файл, сложно дать какой-либо квалифицированный совет, но вы можете сделать что-то вроде этого:

Каждая строка в файле должна иметь идентификатор, представляет ли он фильм или актера, например,

M;Terminator
A;Arnold Schwarzenegger
...

Теперь вы можете перебирать строки, получать идентификатор с помощью String.split(";") и помещать фильмы и актеров в их соответствующие массивы.

Если каждый актер, указанный в списке между двумя фильмами, принадлежит вышеупомянутому фильму (например, Арнольд Шварценеггер снимался в Терминаторе), вы можете вспомнить последний фильм и назначить ему каждого нового актера. Когда вы получаете новый фильм, вы заменяете последнюю сохраненную ссылку на фильм.

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