2

我有一个输入:

aN b c
a1 a2 a3 ... aN

例如:

4 3 2
2 1 2 1 (I have here 'a' numbers, a = 4)
5 6 3
3 9 5 7 3 (I have here 'a' numbers, a = 5)
0 0 0

当 a 或 b 或 c 等于 0 时,我想停止读取输入。我试过这个:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

public class Test {

    public static void main(String[] args) throws IOException {

        InputStreamReader converter = new InputStreamReader(System.in);
        BufferedReader in = new BufferedReader(converter);
        String line = "";
        int a = -1, b = -1, c = -1;
        LinkedList<Integer> list = new LinkedList<>();

        while (a != 0 && b != 0 && c != 0) 
        {
            line = in.readLine();
            String tmp[] = line.split(" ");
            a = Integer.parseInt(tmp[0]);
            b = Integer.parseInt(tmp[1]);
            c = Integer.parseInt(tmp[2]);
            System.out.println("a = " + a + ", b = " + b + ", c = " + c);
            line = in.readLine();
            list.clear();
            tmp = line.split(" ");
            for (int i = 0; i < tmp.length; i++) {
                list.add(new Integer(Integer.valueOf(tmp[i])));
            }
            System.out.println("List = 4 3 2" + list);   
        }   
    }        
}

但有了这个简单的输入:

4 3 2
2 1 2 1
5 6 3
3 9 5 7 3
0 0 0

即使我输入 3 个零,我的程序仍然在等待输入。如何改进它?

编辑:

你误会的人。我需要第二条读取线,因为我需要读取第二条(第四条,第六条)输入线...

4

6 回答 6

3

在您的程序读取带有 0 的行后,它仍在等待另一行,然后才会停止..

最简单的修复(也许不是最干净的):

while (true)
{
   line = in.readLine();
   String tmp[] = line.split(" ");
   a = Integer.parseInt(tmp[0]);
   b = Integer.parseInt(tmp[1]);
   c = Integer.parseInt(tmp[2]);
   if (a == 0 || b == 0 || c == 0)
     break;
   // ...
}
于 2013-02-07T13:12:32.023 回答
3

你有两行:

line = in.readLine();

因此,当第一次读取 3 个零时readLine(),您仍然等待另一个。break如果 a、b、c 中的至少一个为零,您可以更改顺序,或在第一个 readline 之后使用。

于 2013-02-07T13:13:34.437 回答
2
while (true) 
{
        line = in.readLine();
        String tmp[] = line.split(" ");
        a = Integer.parseInt(tmp[0]);
        b = Integer.parseInt(tmp[1]);
        c = Integer.parseInt(tmp[2]);
        if (a == 0 || b == 0 || c == 0) {
            break;
        }
        System.out.println("a = " + a + ", b = " + b + ", c = " + c);
        line = in.readLine();
        list.clear();
        tmp = line.split(" ");
        for (int i = 0; i < tmp.length; i++) {
            list.add(new Integer(Integer.valueOf(tmp[i])));
        }
        System.out.println("List = 4 3 2" + list);   
    } 
于 2013-02-07T13:15:08.600 回答
2

以下是如何以有助于 OP 学习的方式回答问题。

1) 识别问题。

“问题在于,您编写的程序仅测试它是否需要在读取偶数行后停止。您可以通过查看读取输入的位置来看到这一点。”

2) 给出如何解决当前问题的提示。

“如果您希望能够在奇数行上停下来,您将需要另一个测试......在阅读奇数行之后”。

3)指出其他问题。

“事实上,您可能还应该检查:

  • 调用的结果readLine()不是null(当您的程序到达输入末尾时会发生这种情况;例如,如果您在 Linux 上键入 ^D 或在 Windows 上键入 ^Z),
  • 第一行,第三行,第五行等至少有3个数字,依此类推,
  • 和其他一些事情。

如果你不测试这些,你的程序会在输入错误时出现异常而死掉。”


以这种方式回答问题实际上更难/更多工作(对于有经验的程序员)。但鼓励初学者开始思考代码非常重要。毕竟,这是他们作业的真正目标。(没有得到分数,没有产生完美的解决方案......)

于 2013-02-07T13:46:32.437 回答
1

试试这个

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class MultipleInputs {
    public static void main(String[] args) throws IOException {
        InputStreamReader converter = new InputStreamReader(System.in);
        BufferedReader in = new BufferedReader(converter);
        while(true){
            String line = in.readLine();
            List<Integer> numbers = getNumbers(line);
            if(numbers.get(0) != 0 && numbers.get(1) != 0 && numbers.get(2) != 0){
                String line2 = in.readLine();
                List<Integer> numbers2 = getNumbers(line2);
                //TODO: do something with numbers2 
            } else {
                break;
            }
        }
    }
    private static List<Integer> getNumbers(String line){
        String [] strs = line.split(" ");
        List<Integer> list = new ArrayList<Integer>();
        for(String str : strs){
            try{
                list.add(Integer.parseInt(str));
            }catch (NumberFormatException e) {
                // Do nothing, just ignore the sub-string 
            }
        }
        return list;
    }
}
于 2013-02-07T13:24:58.313 回答
0

试试这个。

while((line=in.readLine()) != null){
        String tmp[] = line.split(" ");
        a = Integer.parseInt(tmp[0]);
        b = Integer.parseInt(tmp[1]);
        c = Integer.parseInt(tmp[2]);
        if (a == 0 || b == 0 || c == 0) {
            break;
        }
        for (int i = 0; i < tmp.length; i++) {
            list.add(new Integer(Integer.valueOf(tmp[i])));
        }
}
于 2013-02-07T13:23:28.817 回答