#java #collections #input #arraylist #stdin
#java #Коллекции #ввод #arraylist #stdin
Вопрос:
Я пытаюсь ввести файл в свою программу. Ввод — это файл, переданный по каналу «standard in».
Вот пример ввода:
3 amp; Pink Frost amp; Phillipps, Martin amp; 234933 Se quel guerrier io fossiamp;Puccini, Giacomoamp;297539 Не piu andrai amp; Mozart amp; 234933 M'appari tutt'amor amp; Flotow, F amp; 252905
Моя программа предназначена для сортировки песен / mp3 в порядке названия, композитора и времени выполнения.
- Первое, что я хочу сделать, это получить самое верхнее целое число, которое во введенном примере равно «3», и сохранить его в виде собственного целого числа.
- Следующая строка содержит символ «separator», который, как вы могли видеть, они используют для разделения названия, композитора и времени исполнения для каждой песни.
- Следующие строки представляют собой неопределенное количество песен с указанием названия, композитора и времени исполнения. Что я хотел бы сделать с этим, так это ввести это либо в ArrayList, либо в LinkedList, чтобы я мог использовать компаратор для сортировки слиянием с помощью Collections.sort().
Это то, что у меня пока есть:
public static void main(String args[]) throws IOException {
ArrayList<Song> songs = new ArrayList<Song>();
//Defines the stdin stream
BufferedReader stdin = new BufferedReader (new InputStreamReader(System.in));
System.out.flush();
int k = new Scanner(System.in).nextInt();
}
Итак, я надеюсь, теперь вы знаете, что я хочу сделать.
Это мой запрос: как мне прочитать разные значения в? (т. Е. Детали каждой песни, чтобы поместить их в мой ArrayList.)
Комментарии:
1. Что вы уже сделали? возникли какие-либо проблемы?
Ответ №1:
Обычно предполагается, что разделитель и количество полей известны, и вы не стали бы помещать их в файл. Я бы сделал что-то вроде.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int numOfFields = Integer.parseInt(br.readLine());
Pattern sep = Pattern.compile(br.readLine(), Pattern.LITERAL);
String line;
List<Song> songs = new ArrayList<Song>();
while((line = br.readLine()) != null) {
String[] fields = sep.split(line, numOfFields);
songs.add(new Song(fields[0], fields[1], fields[2]);
}
Collections.sort(songs);
Отказ от ответственности: Если это домашнее задание, вы должны делать так, как вам было показано, а не просто в любом случае, что работает.
Ответ №2:
Используйте BufferedReader
перенос a FileReader
для чтения файла построчно.
Для каждой строки песни используйте String.indexOf
, чтобы найти индексы символа-разделителя, который вы прочитали из второй строки, и String.substring
чтобы получить каждую часть строки в виде отдельной строки.
Используйте Integer.parseInt
для преобразования последней строки в целое число.
Определите Song
класс, содержащий три информации о песне: название, автора и время. Для каждой строки песни создайте новый экземпляр Song
и поместите экземпляр в List<Song>
.
Вызывайте коллекции.сортируйте с помощью компаратора, чтобы отсортировать ваши песни. Читать http://download.oracle.com/javase/tutorial/collections/interfaces/order.html для получения информации о сортировке.
Документацию обо всех этих классах и методах можно найти здесь: http://download.oracle.com/javase/6/docs/api /
Комментарии:
1. Большое вам спасибо! Очевидно, что я довольно новичок в программировании, и я уже некоторое время пытаюсь расшифровать, как выполнять ввод. Я воспользуюсь вашим советом. 🙂