【问题标题】:while inputting multi line input the last line only is considered在输入多行输入时,仅考虑最后一行
【发布时间】:2013-01-27 02:37:17
【问题描述】:

我正在尝试一次向该程序输入一些测试用例,它只是继续输出最后一个输入的结果,而没有剩余的输入

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Scanner;


public class BeautifulStrings2 {

    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        //File f=new File("input.txt");
        Scanner in=new Scanner(System.in);
        BufferedReader in1=new BufferedReader(new InputStreamReader(System.in));
        int n=in.nextInt();
        for (int i=1;i<=n;i++){
            String s=in1.readLine();
            System.out.println(s);
            String chars="";
            if (Character.isUpperCase(s.charAt(0))){
                chars+=s.charAt(0);
            }
            else {
                chars+=Character.toUpperCase(s.charAt(0));
            }
            for (int j=0;j<s.length();j++){
                boolean flag=true;
                for (int k=0;k<chars.length();k++){
                    if (Character.isLetter(s.charAt(j))){
                        if (chars.charAt(k)==Character.toUpperCase(s.charAt(j))){
                            flag=false;
                            break;
                        }
                    }
                }
                if (flag){
                    chars+=Character.toUpperCase(s.charAt(j));
                }
            }
            String temp=chars;
            chars="";
            for (int j=0;j<temp.length();j++){
                if (temp.charAt(j)>64&&temp.charAt(j)<91)
                    chars+=temp.charAt(j);
            }
            int [] numbers=new int[chars.length()];
            Arrays.fill(numbers, 0);
            for (int j=0;j<chars.length();j++){
                for (int k=0;k<s.length();k++){
                    if (chars.charAt(j)==Character.toUpperCase(s.charAt(k))){
                        numbers[j]++;
                    }
                }
            }
            Arrays.sort(numbers);
            int factor=26,sum=0;
            for (int j=chars.length()-1;j>=0;j--){
                sum+=numbers[j]*factor;
                factor--;
            }
            System.out.println("Case #"+i+": "+sum);
        }
    }

}

样本输入

5
ABbCcc
Good luck in the Facebook Hacker Cup this year!
Ignore punctuation, please :)
Sometimes test cases are hard to make up.
So I just go consult Professor Dalves

输出应该是什么

Case #1: 152
Case #2: 754
Case #3: 491
Case #4: 729
Case #5: 646

实际输出

Case #1: 646

编辑! 现在我编辑了我的代码以仅使用 Scanner 对象并添加 in.nextLine() 以跳过第一行

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Scanner;


public class BeautifulStrings2 {

    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        //File f=new File("input.txt");
        Scanner in=new Scanner(System.in);
        //BufferedReader in1=new BufferedReader(new InputStreamReader(System.in));
        int n=in.nextInt();
        in.nextLine();
        for (int i=1;i<=n;i++){
            String s=in.nextLine();
            System.out.println(s);
            String chars="";
            if (Character.isUpperCase(s.charAt(0))){
                chars+=s.charAt(0);
            }
            else {
                chars+=Character.toUpperCase(s.charAt(0));
            }
            for (int j=0;j<s.length();j++){
                boolean flag=true;
                for (int k=0;k<chars.length();k++){
                    if (Character.isLetter(s.charAt(j))){
                        if (chars.charAt(k)==Character.toUpperCase(s.charAt(j))){
                            flag=false;
                            break;
                        }
                    }
                }
                if (flag){
                    chars+=Character.toUpperCase(s.charAt(j));
                }
            }
            String temp=chars;
            chars="";
            for (int j=0;j<temp.length();j++){
                if (temp.charAt(j)>64&&temp.charAt(j)<91)
                    chars+=temp.charAt(j);
            }
            int [] numbers=new int[chars.length()];
            Arrays.fill(numbers, 0);
            for (int j=0;j<chars.length();j++){
                for (int k=0;k<s.length();k++){
                    if (chars.charAt(j)==Character.toUpperCase(s.charAt(k))){
                        numbers[j]++;
                    }
                }
            }
            System.out.println(chars);
            Arrays.sort(numbers);
            int factor=26,sum=0;
            for (int j=chars.length()-1;j>=0;j--){
                sum+=numbers[j]*factor;
                factor--;
            }
            System.out.println("Case #"+i+": "+sum);
        }
    }

}

输出

Case #1: 152
Case #2: 754
Case #3: 491
Case #4: 729

当我按下回车键后出现第五行

Case #5: 646

如何在不按回车的情况下使其显示?!

【问题讨论】:

  • 我尝试添加 in.nextLine();在主循环之前..还是一样!!
  • 好的,我删除了缓冲读取器并在主循环之前保留了 in.nextLine() .. 现在它输出 4 个输出,我仍然必须按 Enter 才能显示第五个输出!!
  • 如果您更改了代码并且现在遇到了新问题,那么您需要发布 最新 代码并编辑您的问题。我会保留您当前的代码并将您的新代码添加到底部,以免我们当前的答案看起来无关紧要。

标签: java


【解决方案1】:

您在两个不同的流阅读器中使用标准输入流 System.in,两次,一个是 Scanner,另一个是 BufferedReader:

Scanner in=new Scanner(System.in);
BufferedReader in1=new BufferedReader(new InputStreamReader(System.in));

这看起来是一件非常危险且容易出错的事情。为什么不简单地使用 Scanner(或 BufferedReader)来处理所有事情?

如果您确实对所有人使用了 Scanner,那么是的,如果下一个令牌将在下一行,请在 nextInt() 之后使用 nextLine()。如果使用扫描仪,您甚至不需要文件顶部的数字 5,因为您会读取行,直到扫描仪的 hasNextLine() 返回 false。

【讨论】:

  • 只使用了扫描仪,现在又出现了新问题.. 请检查编辑后的代码 :)
猜你喜欢
  • 1970-01-01
  • 2020-07-09
  • 1970-01-01
  • 2019-09-17
  • 2020-03-22
  • 1970-01-01
  • 2012-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多