質問
これは私の前に関連している<のhref =「https://stackoverflow.com/questions/929001/how-do-i-adapt-this-program-to-comply-with-the-online-judge」 >質問する
私は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);
}
それが失敗している理由私は得ることはありません。私は、最初の空白行が入力されたときに、キーボードを介して入力の読み取りを停止したい。
編集:ロディオンの答えのおかげで、ReadLn方法が今に変更されます:
if ((input < 0) || (length == 0)) return null; // eof
の代わりに:
if ((input < 0) && (length == 0)) return null; // eof
さて、それは整数出力を生成する前に2つの空白を読んでいます。どのように私はちょうど1を読むためにそれを変更することができますか?
解決
問題は、入力が、それはnullを返しラインに到達したときに<0も、そうではないということです。
while (leido.length() != 0) {
....
}
他のヒント
私は私が正しくあなたの問題を理解している場合は本当にわかりません。あなたは単にあなたのプログラムがコンソールからの読み取りを停止したい場合は、Ctrlキー+ D(Linux)またはCtrlキー+ Z(Windows)を押すことでコンソールを「閉じる」ことができます。これはReadLnメソッドがnullを返すように、-1を返すようにSystem.in.read()を引き起こす。
ナサニエルが提案としてnullをチェックします。
編集:(あなたのコメントに基づいて)
問題がReadLn方法でこの状態にある
if ((input < 0) && (length == 0)) return null;
あなたは空白行を入力すると、長さが0になります。、入力が(お使いのシステムは改行を表すために使用するものは何でも)にもかかわらず> 0になります。 あなたはそれを変更する場合は、
if ((input < 0) || (length == 0)) return null;
入力ストリームのいずれかが閉じられているか、空行が入力された場合、メソッドがnullを返します。の強いテキストの
その代わり!leido.equals(" ")
の、単に!leido.equals("")
を使用しています。前者は空行が入力された場合にのみスペースを含む行が、後者の入力されたときに終了します。
私はずっとあなたの問題を理解しないが、ちょうどそれは、
この方法であなたの条件を使用して私の側から提案をされますwhile(!" ".equals(leido)){
//instead of
while (!leido.equals(" ")){
なぜ、あなたの変数がnull含まれている場合は、あなたのコードが例外をスローします、そして私が述べた条件はそれを行うことは決してありませんので:?P