Java将Arraylist拆分为更小的ArrayLists

时间:2013-11-27 13:57:17

标签: java arraylist

我有一个大小为258

的ArrayList

现在我希望将其拆分为三个不同的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;

}

3 个答案:

答案 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)