Problembearbeitung Eingang für Online-Richter
-
06-09-2019 - |
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?
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
ändernif ((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