Domanda

Questo è legato al mio precedente domanda

Sto risolvendo Ladders Modifica Passo di UVA e cercando di fare il giudice in linea rispettare la mia risposta.

Ho usato il metodo readLn () per adattare il mio programma di file di testo-lettura a questo:

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


}

Dovrei leggere l'intero dell'ingresso del giudice online in quanto sono stati scritti tramite tastiera, ma quando ho eseguito il programma di cui sopra non riesco a farlo smettere di leggere. Va qualcosa come:

abc
cba
aba
cca

senza essere in grado di fermare la lettura della console. Come faccio ad avere intorno a questo ?? Ho il sospetto che il problema è nel mio ciclo condizionale:

String leido=LevenshteinParaElJuez.ReadLn(100);

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

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

Inoltre ho usato:

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

e ottenuto bloccati pure.

Edit: la dichiarazione era in realtà:

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

Non capisco perché è mancato. Voglio che la lettura di ingresso tramite tastiera per fermarsi quando si immette la prima riga vuota.

Modifica: grazie alla risposta di Rodion, il metodo readLn è ora cambiato in:

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

invece che:

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

Ora, è la lettura di due spazio vuoto prima di produrre l'output intero. Come posso cambiare solo per leggere uno?

È stato utile?

Soluzione

Il problema è che l'ingresso non sarà <0 quando raggiunge la linea che restituisce null, in modo da fare:

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

Altri suggerimenti

Non sono proprio sicuro se ho ben capito il problema in modo corretto. Se si desidera semplicemente il vostro programma di smettere di leggere dalla console, è possibile "chiudere" la console premendo Ctrl + D (Linux) o Ctrl + Z (Windows). Ciò causa System.in.read () per restituire -1, in modo che il metodo readLn restituirebbe nullo.

Controlla null come suggerito Nathaniel.

Modifica : (sulla base di tuo commento)

Il problema è con questa condizione nel metodo readLn

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

Se si inserisce una linea vuota, la lunghezza sarà 0, ingresso sarà> 0 se (qualunque sia il vostro sistema usa per indicare una nuova riga). Se si cambia in

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

il metodo ritorna null se sia il flusso di ingresso viene chiusa o viene inserita una riga vuota. strong testo

Invece di !leido.equals(" "), è sufficiente utilizzare !leido.equals(""). Il primo termina quando viene inserito, quest'ultimo una linea contenente solo uno spazio quando viene inserita una riga vuota.

Non capisco il tuo problema molto, ma solo un consiglio da parte mia sarà che utilizzano la sua condizione in questo modo

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

perché, perché il codice sarà un'eccezione se la variabile contiene nulla, e la condizione di cui ho parlato non potrà mai farlo:?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top