2013-11-27 4 views
1

У меня есть ArrayList с размером 258Java разделить Список_массивы на более мелкие ArrayLists

Теперь я хочу, чтобы разделить это на три различные 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; 

}

+1

Как вы определяете TMP? и как он заселен? – BobTheBuilder

+0

Можете ли вы показать отклонение 'tmp' –

+0

Какова связь между' sitesToSearch' и 'tmp'? – Masudul

ответ

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)); 
+0

Мне нужно разбить его на три Arraylists, потому что мне нужно перебирать каждый из трех списков –

+2

@MarcRasmussen: так? вы можете перебирать «Список» так же легко, как и над «ArrayList». –

+0

Я не могу сделать foreach, может ли я? –

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); 

Кроме того, вы должны проверить свои показатели, так как конечный индекс передается Подсписок является эксклюзивным.

1

.subList (fromIndex, toIndex) включен для inIndex и является эксклюзивным для inIndex. С текущим средним кодом и началом никогда не будет заполнено ArrayList.

Ниже два предположения о логике:

.subList (старт, средний)

.subList (середина, конец + 1)

+0

"эксклюзивный для toIndex". это действительно хорошо знать. Вероятно, должен был прочитать документацию по этому поводу: p –

Смежные вопросы