数组越界java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

hugongwang 2017-03-22 08:52:38
第一个程序里面的部分代码:
try {
String charsetName = "UTF-8";
if (file.isFile() && file.exists())
{
InputStreamReader insReader = new InputStreamReader(
new FileInputStream(file), charsetName);
BufferedReader bufReader = new BufferedReader(insReader);
String line=null;
while ((line = bufReader.readLine()) != null)
{
double sim= WordSimilarity.WordSimilarity.simWord(line, s);
if(sim>0.1)
maps.put(tokens[n], tokens3);
}
bufReader.close();
insReader.close();
}
}


catch (Exception e)
{
System.out.println("读取文件内容操作出错");
e.printStackTrace();
} }

第二个程序里面的部分代码:
public static double simWord(String word1, String word2) {
if (ALLWORDS.containsKey(word1) && ALLWORDS.containsKey(word2)) {
List<Word> list1 = ALLWORDS.get(word1);
List<Word> list2 = ALLWORDS.get(word2);
double max = 0;
for (Word w1 : list1) {
for (Word w2 : list2) {
double sim = simWord(w1, w2);
max = (sim > max) ? sim : max;
}
}
return max;
}

return 0.0;
}

/**
* 计算两个词语的相似度
* @param w1
* @param w2
* @return
*/
public static double simWord(Word w1, Word w2) {
// 虚词和实词的相似度为零
if (w1.isStructruralWord() != w2.isStructruralWord()) {
return 0;
}
// 虚词
if (w1.isStructruralWord() && w2.isStructruralWord()) {
List<String> list1 = w1.getStructruralWords();
List<String> list2 = w2.getStructruralWords();
return simList(list1, list2);
}
// 实词
if (!w1.isStructruralWord() && !w2.isStructruralWord()) {
// 实词的相似度分为4个部分
// 基本义原相似度
String firstPrimitive1 = w1.getFirstPrimitive();
String firstPrimitive2 = w2.getFirstPrimitive();
double sim1 = simPrimitive(firstPrimitive1, firstPrimitive2);
// 其他基本义原相似度
List<String> list1 = w1.getOtherPrimitives();
List<String> list2 = w2.getOtherPrimitives();
double sim2 = simList(list1, list2);
// 关系义原相似度
Map<String, List<String>> map1 = w1.getRelationalPrimitives();
Map<String, List<String>> map2 = w2.getRelationalPrimitives();
double sim3 = simMap(map1, map2);
// 关系符号相似度
map1 = w1.getRelationSimbolPrimitives();
map2 = w2.getRelationSimbolPrimitives();
double sim4 = simMap(map1, map2);
double product = sim1;
double sum = beta1 * product;
product *= sim2;
sum += beta2 * product;
product *= sim3;
sum += beta3 * product;
product *= sim4;
sum += beta4 * product;
return sum;
}
return 0.0;
}

/**
* map的相似度。
*
* @param map1
* @param map2
* @return
*/
public static double simMap(Map<String, List<String>> map1,
Map<String, List<String>> map2) {
if (map1.isEmpty() && map2.isEmpty()) {
return 1;
}
int total =map1.size() + map2.size();
double sim = 0;
int count = 0;
for (String key : map1.keySet()) {
if (map2.containsKey(key)) {
List<String> list1 = map1.get(key);
List<String> list2 = map2.get(key);
sim += simList(list1, list2);
count++;
}
}
return (sim + delta * (total-2*count))
/ (total-count);
}

/**
* 比较两个集合的相似度
*
* @param list1
* @param list2
* @return
*/
public static double simList(List<String> list1, List<String> list2) {
if (list1.isEmpty() && list2.isEmpty())
return 1;
int m = list1.size();
int n = list2.size();
int big = m > n ? m : n;
int N = (m < n) ? m : n;
int count = 0;
int index1 = 0, index2 = 0;
double sum = 0;
double max = 0;
while (count < N) {
max = 0;
for (int i = 0; i < list1.size(); i++) {
for (int j = 0; j < list2.size(); j++) {
double sim = innerSimWord(list1.get(i), list2.get(j));
if (sim > max) {
index1 = i;
index2 = j;
max = sim;
}
}
}
sum += max;
list1.remove(index1);
list2.remove(index2);
count++;
}
return (sum + delta * (big - N)) / big;
}



java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.remove(Unknown Source)
at WordSimilarity.WordSimilarity.simList(WordSimilarity.java:362)
at WordSimilarity.WordSimilarity.simMap(WordSimilarity.java:322)
at WordSimilarity.WordSimilarity.simWord(WordSimilarity.java:285)读取文件内容操作出错

at WordSimilarity.WordSimilarity.simWord(WordSimilarity.java:244)
at tfidf.TfIdf.main(TfIdf.java:329)
只知道数组越界,不过不清楚怎么改
...全文
405 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yjuuvtk 2017-03-29
  • 打赏
  • 举报
回复
list1.remove(index1); 首先看一下list1里面是否有数据,然后看看index1是不是0。list没数据看看list里为什么没数据,index1要是0的话看看是不是 while (count < N) {以下的循环都没进去。。跟断点,一步一步看数据
hugongwang 2017-03-29
  • 打赏
  • 举报
回复
那具体怎么改呢?改了几天都没改好
wangjie916 2017-03-22
  • 打赏
  • 举报
回复
list1.remove(index1); list2.remove(index2); 这边报的异常,你这里传进来的2个list的长度应该是0,0长度的list执行remove操作肯定要报这个错误 你可以在每个方法传递进list的时候先打印看一下list的长度,然后再去根源查找原因。
墨笙弘一 2017-03-22
  • 打赏
  • 举报
回复
打个断点 单步执行 看看是哪一步报的这个错误

50,545

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧