很抱歉,如果这是一个愚蠢的问题,我对使用地图非常陌生。
(删除了大部分原帖,因为我完全误解了我应该做的事情。)
static void learnFromText(Map<List<String>, List<String>> whatComesNext, List<String> text) {
List<String> maurice = new ArrayList<String>();
List <String> wallace = new ArrayList<String>();
List <String> romeo = new ArrayList<String>();
for (int i=0; i<=text.size()-3; i++) {
maurice.clear();
wallace.clear();
maurice.add(text.get(i));
maurice.add(text.get(i+1));
if (whatComesNext.containsKey(maurice)==false)
whatComesNext.put(maurice, romeo);
wallace=whatComesNext.get(maurice);
wallace.add(text.get(i+3));
whatComesNext.put(maurice, wallace);
}
}
我有一个字符串列表键和字符串列表值的映射,其中每个键是字符串列表中的两个连续单词&#34; text&#34;。每次我找到键&#34; text.subList(i,i + 2)&#34;我需要将text.get(i + 2)添加到键的值。
例如。
文本元素为[A,B,C,D,A,B,E,F]。
- 键(A,B)的值为(C)。
- 键(B,C)的值是(D)。
- 键(C,D)的值是(E)。
- 键(D,A)的值是(B)。
- 键(A,B)的值为(C,E)。
- 键(B,E)的值为(F)。
醇>
代码的问题在于,当它应该构造whatComesNext时,它会以某种方式返回一个ArrayIndexOutOfBoundsException作为文本的大小。
答案 0 :(得分:1)
问题是clear
不用于重新创建List
。相反,在您的代码中,您在List
的每个元素中使用了相同的Map
实例。然后,当您执行clear
时,它实际上正在清除地图中的所有元素。
您的代码的最低修改应如下所示。
static void learnFromText(Map<List<String>, List<String>> whatComesNext, List<String> text) {
List<String> maurice;
List <String> wallace;
for (int i=0; i<=text.size()-3; i++) {
maurice = new ArrayList<>();
maurice.add(text.get(i));
maurice.add(text.get(i+1));
if (whatComesNext.containsKey(maurice)==false)
whatComesNext.put(maurice, new ArrayList<>());
wallace=whatComesNext.get(maurice);
wallace.add(text.get(i+2));
whatComesNext.put(maurice, wallace);
}
}