0

私はJavaに不慣れで、C ++から来ており、チャットボットをJavaAndroidアプリに変換するさまざまな方法をすばやく学ぶことができます。この関数は、3つ以上の異なる単語を取得すると強制終了しますが、その理由はわかりません。誰かが私がこの謎を打ち負かすのを手伝ってくれるなら、私はわくわくするでしょう!

public void AI(String text) {
// initiate new lists to be on the safe side
List<String>    indexer = new ArrayList<String>();
List<String>    sentence = new ArrayList<String>();
List<String>    explode = new ArrayList<String>();
List<String>    ary = new ArrayList<String>(); 

explode = Arrays.asList(text.split(" "));  

// initiate randint and trigger variable
Random rand = new Random();
int randint = rand.nextInt(explode.size());

// initiate the trigger variable
String trigger = explode.get(randint); 


     // check if word exists in database and add if it not.
for(int i = 0; i < explode.size(); i++) {
    String word = explode.get(i);   

if(common.get(word)==null) {
                        words.add(word);
                        common.put(word, 1);
                        context.put(word, explode);
                        pos.put(word, i);
                        length.put(word, explode.size());

                         }else{
        // increase the weight of common if the word repeats
                         common.put(word, common.get(word)+1 );
                                     }
                                  }
     //check if context with index set as trigger is empty, if not, copy the   arraylist to the ary variable
     if(!context.get(trigger).isEmpty()) {
            Collections.copy( ary, context.get(trigger));}


     // fill the arraylist sentence with words to be used, some in context, some random from the database.
 for(int i2 = 0; i2 < length.get(trigger); i2++ ) {

                  randint = rand.nextInt(length.get(trigger));

if(randint < length.get(trigger)/2) {
                                        //
                                         if(ary.get(i2)!=null) {
                                                                   sentence.add(ary.get(i2));
                                                               }
                                    }else{
                        sentence.add(words.get(rand.nextInt(words.size())));
                                         }

}    

   // use to the pos-hashmap to check at which index the word was detected at, if not     place it at the deliberate index.
for(int i3 = 0; i3 < sentence.size(); i3++) {
                                            if(sentence.get(i3)!=null) {    
                                            indexer.add(pos.get(sentence.get(i3)), sentence.get(i3));   
                                                                       }
                                            }

// compose the final string that is to be passed to the speak function
for(int i4 = 0; i4 < indexer.size(); i4++) {
say = say + indexer.get(i4)+" ";    
    }   

// pass the string to the speak function
mTts.speak(say, TextToSpeech.QUEUE_FLUSH, null);     


// removing final string to be ready for next iteration
    say = "";



// end of AI stuff          
}       

LogCat:

05-26 17:40:08.266: E/AndroidRuntime(490): Uncaught handler: thread main exiting due to  uncaught exception
05-26 17:40:08.276: E/AndroidRuntime(490): java.lang.ArrayIndexOutOfBoundsException
05-26 17:40:08.276: E/AndroidRuntime(490):  at  java.util.Collections.copy(Collections.java:1593)
05-26 17:40:08.276: E/AndroidRuntime(490):  at sarah.namespace.SarahActivity.AI(SarahActivity.java:163)

変数:

// arraylists
public List<String> explode = new ArrayList<String>();
    public List<String> words = new ArrayList<String>();
    public List<String> sentence = new ArrayList<String>();
    public List<String> indexer = new ArrayList<String>();
// hashmaps
    public Map<String, Integer> common = new HashMap<String, Integer>();
public Map<String, List<String>> context = new HashMap<String, List<String>>();
public Map<String, Integer> pos = new HashMap<String, Integer>();
public Map<String, Integer> length = new HashMap<String, Integer>();

 // strings
public String say;

Logcatが指している線:

if(!context.get(trigger).isEmpty()) {
            Collections.copy( ary, context.get(trigger));}
4

1 に答える 1

0

私は問題を特定していませんが、この代替アプローチの方が高速であり、回避する必要があると思います。(正直なところ、あなたのコードは4番目の単語でクラッシュしますか?それはただ奇妙です。私はそれにもっとあると信じています...とにかく)

Java for-eachループはより高速で単純なので、次のようになります。

// check if word exists in database and add if it not.
int i = 0;
for(String word : explode) {
    if(common.get(word) == null) {
        if(word.equals(trigger)) {
            ary = new ArrayList<String>(explode);
        }

    ...
    i++;
}

また、triggerに存在しない場合contextは、空のリストではなくnullが返されるため、簡単な変更を行うことができる場合があります。

if(context.get(trigger) != null && !context.get(trigger).isEmpty()) {
    Collections.copy(ary, context.get(trigger));
}

しかし、これは範囲外ではなくNullPointerExceptionをスローするはずです...4番目の単語が致命的である理由はまだわかりません。お役に立てれば。

于 2012-05-26T18:46:15.607 に答える