Java 在线法官输入的问题处理
这与我以前的经历有关 我正在解决UVA的编辑阶梯,并试图让在线法官遵守我的答案 我已使用ReadLn()方法使我的文本文件读取程序适应以下情况:Java 在线法官输入的问题处理,java,Java,这与我以前的经历有关 我正在解决UVA的编辑阶梯,并试图让在线法官遵守我的答案 我已使用ReadLn()方法使我的文本文件读取程序适应以下情况: import java.io.*; import java.util.*; class LevenshteinParaElJuez implements Runnable{ static String ReadLn(int maxLength){ // utility function to read from stdin,
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];
}
}
无法停止控制台读数。我该怎么解决这个问题??我怀疑问题出在我的循环的条件中:
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((输入<0)| |(长度==0))返回null;//eof
而不是:
if ((input < 0) && (length == 0)) return null; // eof
if((输入<0)和&(长度==0))返回null;//eof
现在,它在生成整数输出之前读取两个空格。我怎样才能把它改成一个呢?问题是输入不会问题是输入不会我不确定我是否正确理解了你的问题。如果您只想让程序停止从控制台读取,可以通过按Ctrl+D(Linux)或Ctrl+Z(Windows)来“关闭”控制台。这会导致System.in.read()返回-1,因此ReadLn方法将返回null 按照Nathaniel的建议检查null 编辑(根据您的评论) 问题在于ReadLn方法中的这个条件
if ((input < 0) && (length == 0)) return null;
if((输入<0)和&(长度==0))返回null;
如果您输入一个空行,长度将为0,但输入将>0(无论您的系统使用什么来表示换行符)。
如果你把它改成
if ((input < 0) || (length == 0)) return null;
if((输入<0)| |(长度==0))返回null;
如果输入流关闭或输入空行,该方法将返回null。strong text我不确定是否正确理解您的问题。如果您只想让程序停止从控制台读取,可以通过按Ctrl+D(Linux)或Ctrl+Z(Windows)来“关闭”控制台。这会导致System.in.read()返回-1,因此ReadLn方法将返回null 按照Nathaniel的建议检查null 编辑(根据您的评论) 问题在于ReadLn方法中的这个条件
if ((input < 0) && (length == 0)) return null;
if((输入<0)和&(长度==0))返回null;
如果您输入一个空行,长度将为0,但输入将>0(无论您的系统使用什么来表示换行符)。
如果你把它改成
if ((input < 0) || (length == 0)) return null;
if((输入<0)| |(长度==0))返回null;
如果输入流关闭或输入空行,则该方法将返回null。strong text而不是
!leido.equals(“”)
,只需使用!leido.equals(“”)
。前者在输入仅包含空格的行时终止,后者在输入空行时终止。而不是!leido.equals(“”)
,只需使用!leido.equals(“”)
。前者在输入只包含空格的行时终止,后者在输入空行时终止。我不太理解您的问题,但我方建议您以这种方式使用您的条件
while(!" ".equals(leido)){
//instead of
while (!leido.equals(" ")){
为什么?因为如果变量包含null,代码将抛出异常,而我提到的条件永远不会这样做:p我不太理解您的问题,但我这边的建议是以这种方式使用您的条件
while(!" ".equals(leido)){
//instead of
while (!leido.equals(" ")){
为什么?因为如果变量包含null,代码将抛出异常,而我提到的条件永远不会这样做:p我不明白这个问题……您一次只想读一个单词吗?如果是,为什么会有循环?如果没有,你想做什么?当我输入一个空行时,我想让程序停止阅读。我不明白这个问题…你想一次只读一个单词吗?如果是,为什么会有循环?如果没有,您想做什么?我希望程序在输入空行时停止读取。我希望程序在收到空行时停止从控制台读取。我在Windows上使用Netbeans的控制台,但我认为在这里按ctrl+z不起作用。谢谢,这确实停止了阅读。问题是,需要两个空行来生成输出。我怎样才能改变它只取一个呢?我希望程序在得到一个空行时停止从控制台读取。我在Windows上使用Netbeans的控制台,但我认为在这里按ctrl+z不起作用。谢谢,这确实停止了阅读。问题是,需要两个空行来生成输出。我怎样才能改变它只取一个呢?对不起,我打错了(!leido.equals(null)),我实际上用了while(leido!=null)),就像你说的那样,我一直在读。当一个空行输入时,我输入了(!leido.equals(null)),我实际使用了while(leido!=null)),就像你说的,我想停止读取,并且无法读取。当输入一个空行时,我希望读数停止