entrada de procesamiento problema para juez de línea
-
06-09-2019 - |
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?
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