【问题标题】:Java split Arraylist into smaller ArrayListsJava 将 Arraylist 拆分为更小的 ArrayList
【发布时间】:2013-12-13 05:00:53
【问题描述】:

我有一个大小为 258 的 ArrayList

现在我希望将其拆分为三个不同的 ArrayList,为此我创建了以下代码:

    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;

}

【问题讨论】:

标签: java arraylist


【解决方案1】:

只需使用List&lt;String&gt; 作为crawl_list1 的类型。

这只是"code against the interface"的一般规则的应用。

确实没有充分的理由要求subList 的返回值是ArrayList(这没有意义,因为subList 在原始@987654327 上返回一个视图 @)。

如果您绝对需要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));

【讨论】:

  • 我需要将其拆分为三个 Arraylist,因为我必须遍历三个列表中的每一个
  • @MarcRasmussen:是吗?您可以像遍历 ArrayList 一样轻松地遍历 List
  • 我不能做 foreach 可以吗?
  • 是的,您应该尽可能多地对接口进行编码:在方法返回List 的任何地方使用List。仅当您需要自己实例化一个新的时才使用ArrayList
  • @MarcRasmussen:我刚才不是说你可以做到这一点吗?你试过了吗?您可以将 foreach 与每个 Iterable 一起使用(包括 Collection,其中包括 List)。
【解决方案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 的结束索引是独占的。

【讨论】:

    【解决方案3】:

    .subList(fromIndex, toIndex) 包含 fromIndex 和排除 toIndex。使用当前代码 middle 和 start 将永远不会填充 ArrayList。

    以下两个是逻辑假设:

    .subList(开始,中间)

    .subList(middle, end+1)

    【讨论】:

    • “toIndex 独有”。这真是太好了。可能应该已经阅读了那个文档:p
    猜你喜欢
    • 2011-02-23
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 2018-08-16
    • 2020-01-30
    相关资源
    最近更新 更多