Ввод из stdin, разделенные значения в список массивов для сортировки

#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 в порядке названия, композитора и времени выполнения.

  1. Первое, что я хочу сделать, это получить самое верхнее целое число, которое во введенном примере равно «3», и сохранить его в виде собственного целого числа.
  2. Следующая строка содержит символ «separator», который, как вы могли видеть, они используют для разделения названия, композитора и времени исполнения для каждой песни.
  3. Следующие строки представляют собой неопределенное количество песен с указанием названия, композитора и времени исполнения. Что я хотел бы сделать с этим, так это ввести это либо в 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. Большое вам спасибо! Очевидно, что я довольно новичок в программировании, и я уже некоторое время пытаюсь расшифровать, как выполнять ввод. Я воспользуюсь вашим советом. 🙂