Android Text 函数 forcecloses rand 问题 [英] Android Text function forcecloses rand issue
问题描述
在上一次修复之后,我现在遇到了一个新问题.被建议问一个新问题,所以就在这里!它仍然强制关闭,但现在在一个新行上.
after the previous fix i now have a new issue. Got advised to ask a new question, so here it is! It still force closes, but now on a new line.
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)
第二个日志:
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)
logcats 在尖叫什么:
What the logcats are screaming at:
首先:
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));
}
}
如果有人能帮我再次破解这个谜语,我会很高兴!
I would be very happy if someone could help me beat this riddle again!
推荐答案
嗯,我不确定哪一行是 186 和 188(抛出 OutOfBounds 异常的两行).但是看着这个循环,我有一些建议:
Hmm, I am uncertain about which lines are 186 and 188 (the two that throw the OutOfBounds exceptions). But looking at this loop, I have some suggestions:
for(int i2 = 0; i2 < length.get(trigger); i2++ ) {
从上面我们注意到 length.get(trigger)
总是设置为 explode.size()
并且我们可以看到 explode.size()
永远不会改变.我们可以检查 explode.size()
或者再次使用 for-each 循环.继续:
From above we notice that length.get(trigger)
is always set to explode.size()
and we can see that explode.size()
never changes. We could check against explode.size()
instead or use a for-each loop again. Carrying on:
randint = rand.nextInt(length.get(trigger));
if(randint < length.get(trigger)/2) {
这看起来您希望有 50/50 的机会:将原始单词添加到 sentence
或
This looks like you want a 50/50 chance of: adding the original word to sentence
or
if(ary.get(i2)!=null) {
sentence.add(ary.get(i2));
}
}else{
sentence.add(words.get(rand.nextInt(words.size())));
}
}
...sentence
的随机单词.
我也相信这可能会引发异常:
Also I beleive this could throw an exception:
if(ary.get(i2)!=null) {
sentence.add(ary.get(i2));
因为您正在根据 length.get(trigger)
而不是 ary.size()
检查 i2
的有效性.现在请记住,ary
只是 explode
的副本.
because you are checking the validity of i2
against length.get(trigger)
not ary.size()
. Now remember that ary
is simply a copy of explode
.
所以让我们把这个循环压缩为:
So let's condense this loop to:
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 循环,你也可以压缩和加速这些循环.我不知道应用程序的其余代码,但您或许可以完全删除一些列表和地图.干杯!
Take a look at the remaining two loops, if you apply a similar for-each loop you will be able to condense and expedite these as well. I don't know the rest of the app's code, but you might be able to remove a few Lists and Maps entirely. Cheers!
这篇关于Android Text 函数 forcecloses rand 问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!