在line.isEmpty()上调用方法时重复的答案输出

时间:2016-05-18 00:05:58

标签: java while-loop duplicates java.util.scanner

我编写了一个程序,它接受输入(用户输入或通过文本文件处理)并根据它找到的内容调用数学计算。

问题在于答案并将其打印出来,因为扫描仪检测到每个line.isEmpty()都会重新计算并打印出之前的答案。如果有4个空行,则会打印4次,直到另一个问题被解析到程序中。

这是我的主要方法:

public static void main(String[] args) {
    Calc calc = new Calc();
    Scanner sc = new Scanner(System.in);
    StringBuilder sb = new StringBuilder();
    String input = "";
    List<String> strs = new ArrayList<>();
    //
    ArrayList<String> tokens;
    //this makes sure an entire problem is added as a tokens element
    while (sc.hasNextLine()) {
        String line = sc.nextLine().trim();
        if (line.isEmpty()) {
            for (String s : strs) {
                sb.append(s);
                input = sb.toString();
            }
            tokens = new ArrayList<>(Arrays.asList(input.split(" ")));
            //call calculate on strs then reset
            calc.calculate(tokens);
            strs.clear();
            tokens.clear();
            sb.setLength(0);
        } else if (line.length() == 1) {
            strs.add(" ");
            strs.add(line);
            strs.add(" ");
        } else {
            strs.add(line);
        }
    }
}

和计算方法:

public String calculate(List<String> tokens) {
    operands = new Stack<>();
    for (int i = 0; i < tokens.size(); i++) {
        tokens.removeAll(Arrays.asList(""));
    }
    String result = processOperands(tokens);

    if (result.equals(null)) {
        System.out.println(result);
        return defaultResult;
    } else if (result.equals("java.lang.IllegalArgumentException: Attempting to add with fewer than 2 operands.")) {
        System.out.println(result);
        return "java.lang.IllegalArgumentException: Attempting to add with fewer than 2 operands.";
    } else {
        System.out.println(result);
        return result.replaceAll("[^\\d.]", "");
    }
}

输入:

2 2 +


4 
3 +

输出:

4
4
4
7

显然问题是我每次检测到一个空字符串时都会调用calculate,因为这是当前它是如何知道问题何时完成“输入”的。

我怎么能修改这个以知道两次不打印相同的答案,或者在找到另一个答案之前不计算答案?

1 个答案:

答案 0 :(得分:1)

输入变量未在逻辑中重置。清除strs,令牌并重置“sb”之后。变量,设置输入=&#34;&#34 ;;