我有一个大小为258
现在我希望将其拆分为三个不同的ArrayLists,为此我创建了以下代码:
Integer start = (int) Math.floor((sitesToSearch.size() / 3));
Integer middle = (int) Math.floor((sitesToSearch.size() / 2));
Integer end = (int) Math.floor((sitesToSearch.size() / 1));
ArrayList<String> crawl_list1 = (ArrayList<String>)tmp.subList(0, start);
ArrayList<String> crawl_list2 = (ArrayList<String>)tmp.subList(start+1, middle);
ArrayList<String> crawl_list3 = (ArrayList<String>)tmp.subList(middle+1, end);
遗憾的是,这会引发以下错误:
Exception in thread "main" java.lang.ClassCastException: java.util.ArrayList$SubList cannot be cast to java.util.ArrayList
那我怎么能把它分成三个较小的ArrayList
tmp declaration:
public ArrayList<String> getExternalLinks(ArrayList<String> rootDomains){
ArrayList<String> result = new ArrayList<String>();
Document doc = null;
/*
* Check if root is valid
* Find search the site for internal links
*/
for (String root : rootDomains) {
if (!(root == null) || !root.isEmpty() ||!root.contains("#")) {
try {
doc = Jsoup.connect(root)
.userAgent("Mozilla")
.get();
result.addAll(findExternalLinks(findInternalLinks(doc,root),root));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
System.out.println(result.size());
return result;
}
答案 0 :(得分:6)
只需使用List<String>
作为crawl_list1
的类型。
这只是"code against the interface"的一般规则的应用。
确实没有理由要求subList
的返回值为ArrayList
(由于subList
返回视图到原始ArrayList
)。
如果绝对需要ArrayList
个对象,则需要将内容复制到新 ArrayList
个对象中:
ArrayList<String> crawl_list1 = new ArrayList<String>(tmp.subList(0, start));
ArrayList<String> crawl_list2 = new ArrayList<String>(tmp.subList(start+1, middle));
ArrayList<String> crawl_list3 = new ArrayList<String>(tmp.subList(middle+1, end));
答案 1 :(得分:2)
the javadoc查看ArrayList.subList()
。它不会返回ArrayList
。它返回List
。没有理由将此列表转换为ArrayList。这是一个列表,这就是你需要知道的全部内容:
List<String> crawl_list1 = tmp.subList(0, start);
List<String> crawl_list2 = tmp.subList(start+1, middle);
List<String> crawl_list3 = tmp.subList(middle+1, end);
此外,您应该检查您的索引,因为传递给subList的结束索引是独占的。
答案 2 :(得分:1)
.subList(fromIndex,toIndex)包含fromIndex,包含forIndex。使用当前代码middle和start将永远不会填充ArrayList。
以下两个是逻辑假设:
.subList(start,middle)
.subList(中间,结束+ 1)