Pregunta

Esto está relacionado con mi anterior pregunta

Estoy resolver Escaleras Editar paso de los rayos UVA y tratando de hacer que el juez de línea cumplir con mi respuesta.

He utilizado el método ReadLn () para adaptar mi programa de archivo de texto-lectura a esto:

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


}

Se supone que tengo que leer la totalidad de la entrada del juez de línea, ya que fueron escritos a través del teclado, pero cuando ejecuto el programa anterior no puedo hacer que deje de leer. Es algo parecido a:

abc
cba
aba
cca

sin ser capaz de detener la lectura de la consola. ¿Cómo consigo alrededor de esto ?? Sospecho que el problema está en mi bucle condicional:

String leido=LevenshteinParaElJuez.ReadLn(100);

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

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

También he utilizado:

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

y quedado atascado también.

Editar: la declaración era en realidad:

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

No entiendo por qué está fallando. Quiero que la lectura de la entrada a través del teclado para detener cuando se introduce la primera línea en blanco.

Edit: gracias a la respuesta de rodion, el método ReadLn ahora ha cambiado a:

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

en lugar de:

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

Ahora, es la lectura de dos espacios en blanco antes de producir la salida de número entero. ¿Cómo puedo cambiarlo sólo para leer uno?

¿Fue útil?

Solución

El problema es que la entrada no será <0 cuando alcanza la línea que devuelve un valor nulo, por lo que hacer:

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

Otros consejos

No estoy realmente seguro si entiendo su problema correctamente. Si solamente desea su programa para dejar de leer desde la consola, se puede "cerrar" la consola pulsando Ctrl + D (Linux) o Ctrl + Z (Windows). Esto hace que System.in.read () para devolver -1, por lo que el método ReadLn volvería nulo.

Comprobar nulo como sugirió Nathaniel.

Editar : (basado en su comentario)

El problema es con esta condición en el método ReadLn

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

Si introduce una línea en blanco, la longitud será 0, la entrada será> 0, aunque (sea cual sea su sistema utiliza para denotar una nueva línea). Si lo cambia a

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

el método devolverá null si bien el flujo de entrada está cerrada o se introduce una línea en blanco. texto fuerte

En lugar de !leido.equals(" "), basta con utilizar !leido.equals(""). El primero termina cuando se introduce, esta última una línea que contiene sólo un espacio cuando se introduce una línea en blanco.

No entiendo su problema mucho, pero sólo un sugiero a mi lado será que el uso de su condición de esta manera

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

¿Por qué, porque su código será lanzar una excepción si su variable contiene nula, y la condición que he mencionado nunca hará que:? P

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top