0

私は、計算言語学の多くの原則を適用するプログラムを作成するためのコードを書いています。現時点での私の問題は、「2 つの定義を柔軟にする」メソッドからの次のコード部分です。これは、同じ単語の 2 つの異なる定義を比較し、各定義に空または空白を追加して、後で変更された定義 (空白を追加) で作業することです。
「自由落下」という用語を定義する次の 2 つの定義があるとします。

1) Free fall descent  of a body subjected only to            the   action of  gravity.
2) Free fall movement of a body in        a    gravitational field under  the influence of gravity

"of"、"a"、"in"、"to"、および "under" という単語を含むストップリストと呼ばれる単語のリストがあります。プロセスの後、ストップリストにも含まれる定義内の各単語は、空白スペースまたは他の定義の別のストップリスト単語に対応する必要があります。したがって、このようなプロセスを実行した後、2 つの異なるリストで表される前の定義は次のようになります。

1) Free fall descent  of a body ____ ____ subjected     only  to     the action    of gravity.
2) Free fall movement of a body in   a    gravitational field under  the influence of gravity.

これを達成するために私が書いたコードは次のとおりです。


[...]
    String[] sList = STOPLIST.split(" ");  //this is the stoplist
    String[] definition1 = defA1.split(" ");  //this is the array of words of the first definition
    String[] definition2 = defA2.split(" ");  //this is the array of words of the second definition
    List<String> def1 = new ArrayList<String>();  
    List<String> def2 = new ArrayList<String>();
    List<String> stopList = new ArrayList<String>();

    for(String word : definition1){
         def1.add(word); //I transform arrays into lists this way because I used to think that using .asList() was the problem.
    }
    for(String word : definition2){
         def2.add(word);
    }
    for(String word : sList){
        stopList.add(word);
    }

    int mdef = (def1.size() <= def2.size()) ? def1.size() : def2.size(); //here mdef will have the value of the lenght of the shortest definition, and we are going to use the value of mdef to iterate later on.

    for(int i = 0; i < mdef; i++){
        if (stopList.contains(def1.get(i))) {  //here I check if the first word of the first definition is also found in the stoplist.
            if (!stopList.contains(def2.get(i))) {  //If the word of def1 previously checked is in the stoplist, as well as the corresponding word in the second definition, then we won't add a " "(blank) space in the corresponding position of the second definition.
                def2.add(i , " "); //here I add that blank space, only if the stoplist word in def1 corresponds to a non-stoplist word in def2. Again, we do this so the stoplist word in def1 corresponds to a blank space OR another stoplist word in def2.
                if(mdef == def2.size())
                    mdef++; //In case the shortest definition is the definition to which we just added spaces, we increment mdef++, because that space added increases the length of the shortest definition, and to iterate in this recenlty extended definiton, we have to increment the index with which we iterate.
            }
        } else if (stopList.contains(def2.get(i))) { //this else if does the same than the previous one, but checks for the second definition instead of the first one. And adds blanks to def1 instead of def2 if necessary.
            if (!stopList.contains(def1.get(i))) {
                def1.add(i , " ");
                if(mdef == def1.size())
                    mdef++;
            }
        }
    }
[...]

ここで、コードを注意深く分析すると、最も長いリストのすべての単語がチェックされるわけではないことがわかります。これは、最も短い定義の長さをインデックスとして使用して定義を反復する場合です。これで問題ありません。最も長い定義の残りの単語をチェックする必要はありません。それらは、他の定義のヌル スペースに対応します (スペースを追加した後にリストが同じ長さにならない場合、前の例が示すように)。

さて、説明の後、問題は次のとおりです。前のコードを含むメソッドを呼び出すメインクラスを実行した後、ランタイム例外が発生します。

    Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 0
        at java.util.ArrayList.rangeCheck(ArrayList.java:571)
        at java.util.ArrayList.get(ArrayList.java:349)
        at main2.main(main2.java:75)

リストのいずれかが「空」であると判断される理由がわかりません。私はあまりにも多くの方法でそれを解決しようとしましたが、私が良い説明をしたことを願っています.

mdef を最短サイズではなく最長サイズに割り当てると、次のような手がかりが役立つ場合があります。

    int mdef = (def1.size() >= def2.size()) ? def1.size() : def2.size();

エラーは次のように変わります。

    Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 15, Size: 15
    at java.util.ArrayList.rangeCheck(ArrayList.java:571)
    at java.util.ArrayList.get(ArrayList.java:349)
    at asmethods.lcc.turnIntoFlex(lcc.java:55)
    at asmethods.lcc.calLcc(lcc.java:99)
    at main2.main(main2.java:73)' 

ここで、lcc は、ここで示しているコードを含むメソッド turnIntoFlex を含むクラスです。「turnIntoFlex」の 55 行目は、ループの最初の行に対応します。つまり、次のようになります。

    if (stopList.contains(def1.get(i))) { [...]
4

1 に答える 1

0
    else if (stopList.contains(def2.get(i))) {
        if (!stopList.contains(def1.get(i))) {
            def1.add(i , " ");
            if(mdef == def2.size())
                mdef++;
        }
    }

if ステートメント mdef == def2.size() は mdef == def1.size() であってはなりませんか? def1 に追加しました

于 2013-10-22T23:16:00.267 に答える