在线判断的问题处理输入

时间:2009-05-30 14:22:42

标签: java

这与我以前的question

有关

我正在解决UVA的编辑步骤,并试图让在线评判符合我的答案。

我使用方法ReadLn()来调整我的文本文件读取程序:

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

class LevenshteinParaElJuez implements Runnable{
    static String ReadLn(int maxLength){  // utility function to read from stdin,
                                          // Provided by Programming-challenges, edit for style only
        byte line[] = new byte [maxLength];
        int length = 0;
        int input = -1;
        try{
            while (length < maxLength){//Read untill maxlength
                input = System.in.read();
                if ((input < 0) || (input == '\n')) break; //or untill end of line ninput
                line [length++] += input;
            }

            if ((input < 0) && (length == 0)) return null;  // eof
            return new String(line, 0, length);
        }catch (IOException e){
            return null;
        }
    }

    public static void main(String args[]) // entry point from OS
    {
        LevenshteinParaElJuez myWork = new LevenshteinParaElJuez();  // Construct the bootloader
        myWork.run();            // execute
    }

    public void run() {
        new myStuff().run();
    }
}
class myStuff implements Runnable{
    public void run(){

        ArrayList<String> theWords = new ArrayList<String>();
        try
        {

        /// PLACE YOUR JAVA CODE HERE

        String leido=LevenshteinParaElJuez.ReadLn(100);

        //System.out.println("lo leido fue "+leido);

        while (!leido.equals(" ")){
        theWords.add(leido);
        leido=LevenshteinParaElJuez.ReadLn(100);
        }


        }catch(Exception e){
            System.out.println("El programa genero una excepcion");
        }


        int maxEdit=0;
        int actualEdit=0;

     int wordsIndex1 =0, wordsIndex2=0;


     while (wordsIndex1<= theWords.size())
     {
      while (wordsIndex2<= theWords.size()-1){
         actualEdit=Levenshtein.computeLevenshteinDistance(theWords.get(wordsIndex1),theWords.get(wordsIndex2));
         if (actualEdit>maxEdit){maxEdit=actualEdit;}
         wordsIndex2++;
      }
     wordsIndex1++;

     }

     System.out.println(maxEdit+1);



    }


}
class Levenshtein {
    private static int minimum(int a, int b, int c) {
        if(a<=b && a<=c)
            return a;
        if(b<=a && b<=c)
            return b;
        return c;
    }

    public static int computeLevenshteinDistance(String str1, String str2) {
        return computeLevenshteinDistance(str1.toCharArray(),
                                          str2.toCharArray());
    }

    private static int computeLevenshteinDistance(char [] str1, char [] str2) {
        int [][]distance = new int[str1.length+1][str2.length+1];

        for(int i=0;i<=str1.length;i++)
                distance[i][0]=i;

        for(int j=0;j<=str2.length;j++)
            distance[0][j]=j;

        for(int i=1;i<=str1.length;i++)
            for(int j=1;j<=str2.length;j++)
                distance[i][j]= minimum(distance[i-1][j]+1,
                                        distance[i][j-1]+1,
                                        distance[i-1][j-1]+
                                        ((str1[i-1]==str2[j-1])?0:1));

        return distance[str1.length][str2.length];
    }


}

我应该阅读整个在线评委的输入,因为它是通过键盘编写的,但是当我运行上述程序时,我无法让它停止阅读。它类似于:

abc
cba
aba
cca

无法停止控制台阅读。我该如何解决这个问题?我怀疑问题出在我的循环条件中:

String leido=LevenshteinParaElJuez.ReadLn(100);

            //System.out.println("lo leido fue "+leido);

            while (!leido.equals(" ")){
            theWords.add(leido);
            leido=LevenshteinParaElJuez.ReadLn(100);
            }

我也用过:

while (!leido.equals(null)){
        theWords.add(leido);
        leido=LevenshteinParaElJuez.ReadLn(100);
        }

并且也被卡住了。

编辑:声明实际上是:

while (leido != null)){
        theWords.add(leido);
        leido=LevenshteinParaElJuez.ReadLn(100);
        }

我不明白为什么它会失败。我希望通过键盘读取输入,以便在输入第一个空白行时停止。

编辑:感谢rodion的回答,ReadLn方法现在改为:

if ((input < 0) || (length == 0)) return null;  // eof

而不是:

if ((input < 0) && (length == 0)) return null;  // eof

现在,在生成整数输出之前,它正在读取两个空格。如何更改它才能阅读?

4 个答案:

答案 0 :(得分:1)

问题是当输入到达返回null的行时,输入不会为&lt; 0,所以:

while (leido.length() != 0) {
    ....
}

答案 1 :(得分:1)

我不确定我是否正确理解你的问题。如果您只是希望程序停止从控制台读取,可以通过按Ctrl + D(Linux)或Ctrl + Z(Windows)“关闭”控制台。这会导致System.in.read()返回-1,因此ReadLn方法将返回null。

纳撒尼尔建议检查是否为空。

修改 :(根据您的评论)

问题在于ReadLn方法中的这个条件

if ((input < 0) && (length == 0)) return null;

如果输入空白行,则长度为0,输入将为&gt; 0虽然(无论你的系统使用什么来表示换行)。 如果将其更改为

if ((input < 0) || (length == 0)) return null;

如果输入流关闭或输入空行,方法将返回null。强文

答案 2 :(得分:1)

而不是!leido.equals(" "),只需使用!leido.equals("")即可。当输入仅包含空格的行时,前者终止,后者在输入空行时终止。

答案 3 :(得分:0)

我不太了解你的问题,但只是我方面的建议就是以这种方式使用你的情况

while(!" ".equals(leido)){  
//instead of   
while (!leido.equals(" ")){

为什么?,因为如果您的变量包含null,您的代码将抛出异常,并且我提到的条件永远不会这样做:P

相关问题