Frage

Dies ist im Zusammenhang mit meinem früheren Frage

Ich bin UVA Schritt Bearbeiten Leitern zu lösen und zu versuchen, den Online-Richter mit meiner Antwort entspricht zu machen.

ich verwendet habe, die Methode ReadLn (), um mein Text-Datei-Leseprogramm an diese anzupassen:

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


}

Ich soll das Ganze des Online-Richters Eingang lesen, da sie über die Tastatur geschrieben wurden, aber wenn ich das obige Programm ausführen kann ich es nicht lesen zu stoppen. Es geht in etwa so:

abc
cba
aba
cca

ohne die Möglichkeit, die Konsole Lesen zu stoppen. Wie kann ich dieses Problem umgehen ?? Ich vermute, dass das Problem ist in meiner Schleife Conditional:

String leido=LevenshteinParaElJuez.ReadLn(100);

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

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

Ich habe auch verwendet:

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

und gotten auch stecken.

Edit: die Erklärung war eigentlich:

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

ich nicht bekommen, warum es scheitern. Ich möchte das Lesen der Eingabe über die Tastatur zu stoppen, wenn die erste Leerzeile eingegeben wird.

Edit: Dank Rodion Antwort wird die ReadLn Methode nun geändert:

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

statt:

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

Nun, es liest zwei Leerzeichen vor dem Integer-Ausgangssignal zu erzeugen. Wie kann ich es nur ein lesen ändern?

War es hilfreich?

Lösung

Das Problem ist, dass die Eingabe nicht <0 sein wird, wenn es die Linie erreicht, die null zurückgibt, so tun:

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

Andere Tipps

Ich bin nicht wirklich sicher, ob ich das Problem richtig zu verstehen. Wenn Sie lediglich Ihr Programm wollen aus der Konsole aufhören zu lesen, können Sie auf „Schließen“ die Konsole durch Drücken von Strg + D (Linux) oder Strg + Z (Windows). Dies bewirkt, dass System.in.read () -1 zurück, so dass ReadLn Methode null zurückkehren würde.

Nach null als Nathaniel vorgeschlagen.

Bearbeiten : (basierend auf Ihrem Kommentar)

Das Problem ist mit diesem Zustand in der ReadLn Methode

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

Wenn Sie eine leere Zeile eingeben, Länge 0 sein wird, wird eingegeben werden> 0 wenn (was auch immer das System eine neue Zeile zu bezeichnen, verwendet). Wenn Sie es

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

Das Verfahren wird null zurück, wenn entweder der Eingangsstrom geschlossen ist, oder eine Leerzeile eingegeben wird. starker Text

Statt !leido.equals(" "), einfach !leido.equals("") verwenden. Der erstere wird beendet, wenn eine Zeile nur einen Raum enthält, eingegeben wird, wobei letztere, wenn eine Leerzeile eingegeben wird.

ich nicht Ihr Problem verstehe viel, aber nur vorschlagen, von meiner Seite aus, dass Ihre Bedingung auf diese Weise benutzen,

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

, warum, weil Ihr Code eine Ausnahme auslösen, wenn Ihre Variable null enthalten, und die Bedingung, die ich bereits erwähnt wird das nie tun: P

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top