从stdin输入,将值分隔成ArrayList进行排序

时间:2011-05-28 11:17:15

标签: java collections input arraylist stdin

我正在尝试将文件输入到我的程序中。输入是一个用“标准输入”的文件。

以下是输入示例:

3
&
Pink Frost&Phillipps, Martin&234933
Se quel guerrier io fossi&Puccini, Giacomo&297539
Non piu andrai&Mozart&234933
M'appari tutt'amor&Flotow, F&252905

我的程序是按照标题,作曲家和运行时间的顺序对歌曲/ mp3进行排序。

  1. 我想做的第一件事是获取最上面的整数,在示例输入中为“3”,并将其存储在我自己的整数中。
  2. 下一行包含“分隔符”字符,正如您所看到的,它们用于分隔每首歌曲的标题,作曲家和运行时间。
  3. 下一行是包含标题,作曲家和运行时间详细信息的不确定数量的歌曲。我想要做的是将它输入到ArrayList或LinkedList中,这样我就可以使用比较器使用 Collections.sort()来合并这些。
  4. 这是我到目前为止所得到的:

        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中的详细信息。)

2 个答案:

答案 0 :(得分:0)

使用BufferedReader换行FileReader逐行读取文件。

对于每首歌曲行,使用String.indexOf查找从第二行读取的分隔符char的索引,并使用String.substring将该行的每个部分作为单独的字符串。

使用Integer.parseInt将最后一个字符串转换为整数。

定义一个Song类,其中包含有关歌曲的三个信息:标题,作者和时间。对于每个歌曲行,构建一个Song的新实例,并将该实例放在List<Song>中。

使用比较器调用Collections.sort以对歌曲进行排序。有关排序的信息,请阅读http://download.oracle.com/javase/tutorial/collections/interfaces/order.html

有关所有这些类和方法的文档,请访问:http://download.oracle.com/javase/6/docs/api/

答案 1 :(得分:0)

通常假设分隔符和字段数已知,您不会将它们放在文件中。我会做类似的事情。

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);

免责声明:如果这是作业,你必须以你的方式展示,而不仅仅是有效。