معالجة مشكلة في معالجة القاضي عبر الإنترنت

StackOverflow https://stackoverflow.com/questions/929802

  •  06-09-2019
  •  | 
  •  

سؤال

هذا يرتبط مع بلدي السابق سؤال

أنا حل سلالم خطوة تحرير UVA ومحاولة جعل القاضي عبر الإنترنت يتوافق مع إجابتي.

لقد استخدمت الطريقة Readln () لتكييف برنامج قراءة TextFile الخاص بهذا:

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


}

من المفترض أن أقرأ كامل مدخلات القاضي عبر الإنترنت كما كتب عبر لوحة المفاتيح، ولكن عندما أقوم بتشغيل البرنامج أعلاه، لا يمكنني إيقاف القراءة. إنه شيء مثل:

abc
cba
aba
cca

دون أن تكون قادرة على وقف قراءة وحدة التحكم. كيف يمكنني الحصول على حول هذا؟؟ أظن أن المشكلة في حلقتي مشروطة:

String leido=LevenshteinParaElJuez.ReadLn(100);

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

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

لقد استخدمت أيضا:

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

وحصلت عالقة كذلك.

تحرير: كان الإعلان في الواقع:

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

أنا لا أفهم لماذا فشل. أريد أن تتوقف قراءة الإدخال عبر لوحة المفاتيح عند إدخال الخط الفارغ الأول.

تحرير: بفضل إجابة Rodion، تم تغيير طريقة Readln الآن إلى:

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

بدلا من:

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

الآن، يقرأ مساحة فارغة قبل إنتاج الإخراج الصحيحة. كيف يمكنني تغييره فقط لقراءة واحدة؟

هل كانت مفيدة؟

المحلول

المشكلة هي أن المدخلات لن تكون <0 عندما تصل إلى السطر الذي يرجع NULL، لذلك:

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

نصائح أخرى

أنا لست متأكدا حقا إذا فهمت مشكلتك بشكل صحيح. إذا كنت ترغب فقط في إيقاف البرنامج الخاص بك عن القراءة من وحدة التحكم، فيمكنك "إغلاق" وحدة التحكم عن طريق ضرب Ctrl + D (Linux) أو Ctrl + Z (Windows). هذا يسبب System.in.Read () للعودة -1، بحيث تعيد طريقة Readln NULL.

تحقق من خالية كما اقترح ناثانيل.

يحرر: (بناء على تعليقك)

المشكلة هي مع هذه الحالة في طريقة Readln

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

إذا قمت بإدخال سطر فارغ، فسيكون الطول 0، وسيتم إدخال الإدخال> 0 على الرغم من (مهما كان يستخدم نظامك للإشارة إلى خط جديد). إذا قمت بتغييره إلى

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

ستعود الأسلوب NULL إذا تم إغلاق دفق الإدخال أو يتم إدخال سطر فارغ.نص قوي

بدلا من !leido.equals(" "), ، ما عليك سوى استخدام !leido.equals(""). وبعد ينتهي السابق عند إدخال خط يحتوي فقط على مساحة فقط، وهو الأخير عند إدخال سطر فارغ.

أنا لا أفهم مشكلتك كثيرا، ولكن فقط اقتراح من جانبي سيكون استخدام حالتك بهذه الطريقة

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

لماذا؟، لأن الكود الخاص بك سوف يرمي استثناء إذا كان المتغير يحتوي على فارغة، والشرط الذي ذكرته لن يفعل ذلك أبدا: P

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top