как записать элементы ArrayList‹Arra› в файл с помощью JAVA?

Я прочитал текстовый файл, содержащий список слов с их тегами, и поместил их как ArrayList в обертку ArrayList (ArrayList).

[[1, that, that, that, DT, DT], [2, table, table, table, NN, NN]]

Теперь я хочу написать в текстовом файле в том же формате следующим образом:

1    that    that     that    DT    DT  
2    table   table    table   NN    NN

каждая из приведенных выше строк представляет собой список ArrayList с 6 столбцами.

следующий код возвращает файл с Ԁ внутри.

public void setPPOSOfWordInDevelopmentList(ArrayList<ArrayList> trainingList){
try{
    FileOutputStream streamFile = new FileOutputStream("developmentFile.txt");
    ObjectOutputStream streamFileWriter = new ObjectOutputStream(streamFile);
for(ArrayList word: developmentWordsList){
    String inputWord = (String)word.get(1);
    extractTag(inputWord,trainingList);
    String extractedPPOSofWord =(String)findMaxTag().get(1);
    word.set(5, extractedPPOSofWord);

}
streamFileWriter.close();
System.out.println(developmentWordsList);
}
catch(Exception e){
    System.out.println("Something went wrong, check the code");
}
}

этот код связан с некоторыми другими, поэтому изменить формат объектов, возвращаемых функциями, непросто.


person msc87    schedule 15.04.2014    source источник


Ответы (3)


Если вы хотите написать простой текстовый файл, лучше использовать BufferedWriter. Для вашего контента вы можете отформатировать его в StringBuffer или StringBuilder, если он слишком длинный. Здесь, в этом посте, я ответил на вопрос, связанный с типом форматирования, которое вы пытаетесь сделать. Но вам нужно адаптировать его в соответствии с вашим форматом и логикой использования массива обертки.

Экспорт значений массива в CSV-файл java

Я думаю, что оператор цикла или «расширенный для» следует использовать как нечто вроде:

for (ArrayList<String> innerArray: wrapperArray) {
    for (String word : innerArray) {
        //Adapt to your required format using a StringBuilder
    }
}
//Here at the end save the content of your StringBuilder or StringBuffer using the BufferedWriter.

Надеюсь, вы можете получить представление о том, как этого добиться. С наилучшими пожеланиями :)

person Marcelo Tataje    schedule 15.04.2014
comment
Я ищу более прямой способ, который принимает arrayList в качестве входных данных, но, к сожалению, такого не существует. - person msc87; 16.04.2014

То, что вы хотите, очень похоже на стандартный файл CSV. Этот поток stackoverflow поможет вам понять, как анализировать такой контент. Я настоятельно рекомендую вам провести рефакторинг по строкам CSV-файла вместо использования ObjectInput/OutputStreams. Его будет проще поддерживать, и вы сможете использовать такие инструменты, как Excel и OpenOffice Calc, для просмотра файлов при отладке.

person Mike Thomsen    schedule 15.04.2014
comment
По мере чтения входного файла над ним будут выполняться некоторые процессы, такие как тегирование (POS). тогда вывод должен быть точно таким же, как ввод, текст со строками с 6 столбцами, разделенными табуляцией для каждого слова. Если я использую System.out.println(output), список массивов будет записан как список массивов на консоли. теперь я хочу распечатать его в файле и отформатировать нужным образом. - person msc87; 15.04.2014

Если вы уверены, что используете файл пользовательского формата, вы можете использовать форматированную печать и добавить соответствующие отступы. Это довольно просто:

for (ArrayList<String> list : trainingList) {
    writeToStream(
        String.format(
            %s, %-5s, %-5s, %-5s, 
            list.getAt(0),list.getAt(1),list.getAt(2),list.getAt(3)
        );
    }
}

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

person t-my    schedule 15.04.2014