【问题标题】:Android Text function forcecloses rand issueAndroid Text 函数强制关闭 rand 问题
【发布时间】:2012-05-26 21:48:22
【问题描述】:

在上一次修复之后,我现在有一个新问题。有人建议提出一个新问题,所以就在这里! 它仍然强制关闭,但现在换行了。

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.
    int i = 0;
    for(String word : explode) {
        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());



            if(word.equals(trigger)) {
                ary = new ArrayList<String>(explode);
            }
        }else{

            common.put(word, common.get(word)+1 );  
        }

        i++;
    }



    // 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          
}   

变量:

    // 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:

05-26 19:24:42.926: W/dalvikvm(543): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
05-26 19:24:42.926: E/AndroidRuntime(543): Uncaught handler: thread main exiting due to uncaught exception
05-26 19:24:42.956: E/AndroidRuntime(543): java.lang.IndexOutOfBoundsException: Invalid location 0, size is 0
05-26 19:24:42.956: E/AndroidRuntime(543):  at java.util.ArrayList.get(ArrayList.java:341)
05-26 19:24:42.956: E/AndroidRuntime(543):  at sarah.namespace.SarahActivity.AI(SarahActivity.java:186)

第二个logcat:

 05-26 21:38:44.555: W/dalvikvm(571): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
05-26 21:38:44.555: E/AndroidRuntime(571): Uncaught handler: thread main exiting due to uncaught exception
05-26 21:38:44.575: E/AndroidRuntime(571): java.lang.IndexOutOfBoundsException
05-26 21:38:44.575: E/AndroidRuntime(571):  at java.util.ArrayList.add(ArrayList.java:145)
05-26 21:38:44.575: E/AndroidRuntime(571):  at sarah.namespace.SarahActivity.AI(SarahActivity.java:188)

日志猫在尖叫什么:

第一:

sentence.add(words.get(rand.nextInt(words.size())));

第二:

for(int i3 = 0; i3 < sentence.size(); i3++) {
                                            if(sentence.get(i3)!=null) {    
                                            indexer.add(pos.get(sentence.get(i3)), sentence.get(i3));   
                                                                       }
                                            }

如果有人能帮助我再次破解这个谜题,我会非常高兴!

【问题讨论】:

  • 第186行真的是sentence.add(words.get(rand.nextInt(words.size())));吗?因为text 不能为空,这意味着words 应该至少包含一个值,并且这一行应该可以工作...
  • 是的,我明白你的意思,我认为问题在于第二个嫌疑人。
  • 通过预先缩放arraylist解决了这个问题,但是现在我遇到了一个新问题,为什么这里会返回一个indexoutofbounds? if(ary.get(i2)!=null) { sentence.add(ary.get(i2)); } 编辑:nvm,现在又坏了。
  • 如果 ary.size() 是 10 并且 i2 是 10 或更多,这将导致异常。看我的回答。

标签: android random arraylist forceclose


【解决方案1】:

嗯,我不确定哪一行是 186 和 188(这两行会引发 OutOfBounds 异常)。但是看看这个循环,我有一些建议:

for(int i2 = 0; i2 < length.get(trigger); i2++ ) {

从上面我们注意到length.get(trigger) 总是设置为explode.size(),我们可以看到explode.size() 永远不会改变。我们可以检查explode.size(),或者再次使用for-each 循环。继续:

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

    if(randint < length.get(trigger)/2) {

这看起来你想要一个 50/50 的机会:将原始单词添加到 sentence 或

        if(ary.get(i2)!=null) {
            sentence.add(ary.get(i2));
        }
    }else{
        sentence.add(words.get(rand.nextInt(words.size())));
    }
}    

...sentence 的随机单词。

我也相信这可能会引发异常:

        if(ary.get(i2)!=null) {
            sentence.add(ary.get(i2));

因为您正在检查 i2 与 length.get(trigger) 而不是 ary.size() 的有效性。现在请记住,ary 只是 explode 的副本。

所以让我们把这个循环压缩成:

for(String word : explode) {
    if(rand.nextInt(1)) // 50/50 chance of being false or true (0 or 1)
        sentence.add(word);
    else
        sentence.add(words.get(rand.nextInt(words.size())));
}

看看剩下的两个循环,如果你应用一个类似的 for-each 循环,你也可以压缩和加速这些循环。我不知道应用程序的其余代码,但您也许可以完全删除一些列表和地图。干杯!

【讨论】:

  • 谢谢!那行得通!现在它只有 i3 循环返回 indexoutofboundexception。
  • 好的,通过在 i3 之前添加这个循环来修复它。 for (int i2 = 0; i2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多