2009-05-30 22 views
0

これは私がUVAの編集ステップはしごを解決し、オンライン裁判官が私の答えに準拠させるためにしようとしている私の前question問題の処理入力

に関連しています。私はこれに私のテキストファイル読み取りプログラムを適応させる方法の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]; 
    } 


} 

Iよ、それはキーボードで書かれていたとして、オンライン裁判官の入力の全体を読むことになったが私は上記のプログラムを実行すると、私はそれを読書を停止することはできません。それは次のようになります:

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); 
     } 

私は得ることはありません。私は、最初の空白行が入力されたときにキーボードによる入力の読みを停止したい。

編集:それは整数出力を生成する前に2つの空白を読んでいる、今

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

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

の代わり:ロディオンの答えのおかげで、ReadLn方法は今に変更されます。私はそれをただ読むように変更することはできますか?

+0

私は質問を理解していません...あなたは一度に1単語を読みたいですか?もしそうなら、なぜあなたはループを持っていますか?そうでない場合、あなたは何をしたいですか? –

+0

空行を入力するとプログラムの読み込みを停止したい。 – andandandand

答えて

1

問題は、入力が、それはnullを返しラインに到達したとき< 0も、そうではないということです。

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

申し訳ありませんが、私は誤って入力しました(!leido.equals(null))、実際に使用していました(leido!= null))空白行が入ったときに読みが止まるようにしたい – andandandand

+0

これはすべての問題を解決します。 – andandandand

1

私は私が正しくあなたの問題を理解している場合は本当にわかりません。あなたのプログラムのコンソールからの読み込みを止めたいだけなら、Ctrl + D(Linux)またはCtrl + Z(Windows)を押すことでコンソールを "閉じる"ことができます。これにより、System.in.read()は-1を返すため、ReadLnメソッドはnullを返します。

ナサニエルが提案したようにヌルを確認してください。

編集:(あなたのコメントに基づいて)あなたは空白行を入力すると、長さが0になります

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

問題がReadLn方法でこの条件であり、入力は次のようになります> 0(ただし、あなたのシステムが改行を示すために使用するもの)。 あなたが

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

に変更した場合、入力ストリームが閉じられているか、空白行が入力されたいずれかの場合、このメソッドはnullを返します。 強いテキスト

+0

空白行を取得したときにコンソールからの読み込みを停止したい。私はWindows上でNetbeansのコンソールを使用していますが、Ctrl + Zを押すとここではうまくいかないと思います。 – andandandand

+0

ありがとう、これは読書を停止します。つまり、出力を生成するには2つの空白行が必要です。どのように私はそれを取るように変更することができますか? – andandandand

1

!leido.equals(" ")の代わりに、!leido.equals("")を使用してください。前者はスペースだけを含む行が入力されたときに終了し、後者は空白行が入力されたときに終了する。

0

私はそれがこのよう

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

なぜにあなたの状態を使用するのだろうか?、あなたの変数がnull含まれている場合は、あなたのコードは、例外がスローされますので、多くの問題を理解しないが、ちょうど私の側から提案します私が言及した条件は決してそれをしません:P