Java 多行输入

标签 java jcreator

<分区>

我正在尝试解决在线编程问题(这里是:http://acm.timus.ru/problem.aspx?space=1&num=1002)。
然而,每当我尝试第一个输入数据时:

7325189087        (a call number to decipher)
20                (total number of words to input)
...               (input here Words up to 20 lines)

The Java console doesn't respond/hangs after the 20th line. Can anyone help me point where the error is occurring? I tried both Scanner and BufferedReader, as well as on Windows command prompt and JCreator's command line, but to no avail.
Here's the code:

import java.util.*;
import java.io.*;

class PhoneNumbers {

    static List<String> cmb = new ArrayList<String>();
    static List<String> indices = new ArrayList<String>();
    static List<String> outputs = new ArrayList<String>();

    public static void main(String[] args) throws IOException{
        //BufferedReader in = new BufferedReader(new InputStreamReader((System.in)));
        Scanner in = new Scanner(new BufferedInputStream(System.in));
        String inp = "";
        while(true) {
            System.out.print(" ");
            inp = in.nextLine();
            if(inp.equals("-1")) break;
            System.out.print(" ");
            int loops = Integer.parseInt(in.nextLine());
            //String[] words = new String[loops];
            List<String> words = new ArrayList<String>();
            for(int i = 0; i < loops; i++){
                System.out.print(" ");
                words.add(in.nextLine());       //Error occurs here. if loop is 20 line or more.
            }
            String nums = "";
            for(int i = 0; i < words.size(); i++)
                nums += i;
            Combi("",nums,words,inp.length());
            boolean isfound = false;
            String ind = "";
            int len = 100;
            for(int i = 0; i < cmb.size(); i++){
                String result = "";
                for(int i2 = 0; i2 < cmb.get(i).length(); i2++) {   
                    result += getVal((cmb.get(i).charAt(i2) + "").toLowerCase());
                }
                if(inp.equals(result)) {
                    isfound = true;
                    int len2 = indices.get(i).length();
                    if(len2 < len){
                        len = len2;
                        ind = indices.get(i);
                    }
                }
            }
            if(isfound){
                String out = "";
                for(int i = 0; i < ind.length(); i++) {
                    int x = Integer.parseInt(ind.charAt(i) + "");
                    out += words.get(x);
                    if(i < ind.length() - 1)
                        out += " ";
                }
                outputs.add(out);
            }
            else
                outputs.add("No solution.");
            cmb.clear();
            indices.clear();
        }

        cmb.clear();
        indices.clear();
        for(int i = 0; i < outputs.size(); i++)
            System.out.println(outputs.get(i));
    }

    public static void Combi(String pre, String s, List<String> col, int len) {
        if(!pre.equals("")){
            String nval = "";
            for(int i = 0; i < pre.length(); i++){
                nval += col.get(Integer.parseInt(pre.charAt(i) + ""));
            }
            if(nval.length() == len){
                cmb.add(nval);
                indices.add(pre);
                Perm("",pre,col,len);
            }
        }
        for(int i = 0; i < s.length(); i++)
            Combi(pre + s.charAt(i), s.substring(i + 1),col,len);
    }

    public static void Perm(String pre, String s, List<String> col, int len) {
        int n = s.length();
        if(n == 0){
            String nval = "";
            for(int i = 0; i < pre.length(); i++){
                nval += col.get(Integer.parseInt(pre.charAt(i) + ""));
            }
            if(cmb.contains(nval) == false){
                cmb.add(nval);
                indices.add(pre);
            }
        } else{
            for(int i = 0; i < n; i++)
                Perm(pre + s.charAt(i), s.substring(0,i) + s.substring(i + 1, n),col,len);
        }
    }

    public static int getVal(String ltr) {
        if (ltr.equals("i") || ltr.equals("j"))
            return 1;
        if (ltr.equals("a") || ltr.equals("b") || ltr.equals("c"))
            return 2;
        if (ltr.equals("d") || ltr.equals("e") ||ltr.equals("f"))
            return 3;
        if(ltr.equals("g") || ltr.equals("h"))
            return 4;
        if (ltr.equals("k") || ltr.equals("l"))
            return 5;
        if (ltr.equals("m") || ltr.equals("n"))
            return 6;
        if (ltr.equals("p") || ltr.equals("r") || ltr.equals("s"))
            return 7;
        if (ltr.equals("t") || ltr.equals("u") || ltr.equals("v"))
            return 8;
        if (ltr.equals("w") || ltr.equals("x") || ltr.equals("y"))
            return 9;
        if (ltr.equals("o") || ltr.equals("q") || ltr.equals("z"))
            return 0;
        return -1;
    }
}

附言- 如果我的代码仍然没有那么有效,我深表歉意。我还在练习 :D
- 有一些 System.Print(""),因为 JCreator 的控制台在处理输入时很容易出错,而不先打印一些东西。
- 我不寻求有关此问题的帮助。我就问为什么Java无缘无故卡在第20行。

提前感谢您的帮助。

最佳答案

如果不使用调试器单步执行它,我猜代码会卡在这一行:

inp = in.nextLine();

第20行是“-1”吗?如果没有,那么这肯定是它挂起的地方,因为没有其他方法可以退出 while(true) 循环。如果是,请确保您输入的数据正确,并且当到达“-1”行时,inp 的值恰好是 “-1”,不是 "-1\n" 或类似的东西。

我建议在您的 while 循环中添加一个 print 语句,它只打印读入的每个 inp 的值,或者按照其他人的建议逐步执行调试器。

关于Java 多行输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14305053/

相关文章:

java - JNI C++ DLL - 'UnsatisfiedLinkError: %1 is not a valid Win32 application'

java - 如何在Java编辑器中使用语法高亮显示?

java - 将 Intellij 中的项目与 checkin subversion 的项目进行比较?

java - 如何编译一个包含多个文件的java项目?

java - 线程 "AWT-EventQueue-0"java.lang.NumberFormatException 中出现异常

java - java中控制台输出变化

java - 如何在 JCreator 中开启智能感知?

java - 如何使用 JOption.pane 在我的程序中输入 If 语句?

Java:计算时区差异

java - 代码编译后出错——找不到符号