这与我以前的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
现在,在生成整数输出之前,它正在读取两个空格。如何更改它才能阅读?
答案 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