在Java中使用管道的意外结果

时间:2015-11-18 14:06:06

标签: java arraylist collections

我有2个应用程序1在1-49之间生成6个随机数(我使用LinkedHashSet因为数字不能重复):

LinkedHashSet hs = new LinkedHashSet();
do{
    int valor =  1 + (int)(Math.random() * ((49 - 1)));
    String num = "" + valor;
    hs.add(num);

}while(hs.size()< 6);

String[] x = (String[]) hs.toArray(new String[hs.size()]);
for(int i = 0; i<6;i++){
    System.out.println(x[i]);
}

这个本身工作正常,问题出在第二个,它被命令对第一个应用程序给出的值进行排序,所以我使用了一个ArrayList:

System.out.println("Proceso lector");
List<Integer> lista = new ArrayList();
while(bf.readLine() != null){
   lista.add(Integer.valueOf(bf.readLine()));
}

Collections.sort(lista);
for(int i=0; i<lista.size();i++){
    System.out.println(lista.get(i));
}

我生成了jar并使用了下一个命令: java -jar prog1.jar | java -jar prog2.jar 预期的结果将是订购的6个数字,但我整个时间只得到3,尽管第一个程序生成了6 ...

1 个答案:

答案 0 :(得分:2)

在这个循环中,你读了一行,扔掉它,然后读另一行,它被添加到列表中:

while(bf.readLine() != null){
    lista.add(Integer.valueOf(bf.readLine()));
}

这与您期望6行时看到3行是一致的。

这可以通过多种方式重写,例如:

while (true) {
    String line = bf.readLine();
    if (line == null) {
        break;
    }
    lista.add(Integer.valueOf(line));
}

请注意,bf.readLine()每次迭代只调用一次。