2014-12-25 4 views
0

У меня есть массив list.I'd хотел сломать же в подсписком фиксированных size.for пример -Divide в суб список фиксированного размера

Если мой список размер 100.I хочет чтобы иметь 30 элементов в одном списке. Поэтому в основном я хотел бы создать 4 суб-списка. Каков наиболее оптимизированный способ достичь этого ... Я смотрел в Интернете, но большинство предложений привело к разрыву списка массивов, не имели фиксированного размера. Наиболее желательно, я хотел бы иметь сервис/метод, который выполняет задание

ответ

2

Если вам разрешено использовать сторонние библиотеки, Guava предоставляет это как единственный метод Lists.partition, который является постоянным временным представлением.

0
  • Вы можете использовать List<E> subList(int fromIndex, int toIndex); для составления подписок.
  • Затем вы можете преобразовать каждый Подсписок в массив, используя <T> T[] toArray(T[] a);
  • Наконец Arrays.asList даст вам фиксированного размера списка подкрепленную массива.
+0

Почему объезд в T []? – laune

+0

@laune OP хотел фиксированный размер подписок. Arrays.asList создает такие списки. Вам нужен массив для использования Arrays.asList. – Eran

+0

Конструктор из коллекции проходит через массив, так что это спорный вопрос - я предпочитаю не писать то, что уже было написано. И даже если нет, вы можете назвать trimToSize. (И это на самом деле не исправлено **, правильно?) – laune

1
public static <T> List<List<T>> split(List<T> alist, int len){ 
    List<List<T>> listOfLists = new ArrayList<>(); 
    int hi = 0; 
    for(int lo = 0; lo < alist.size(); lo = hi){ 
    hi = lo + len; 
    if(hi > alist.size()) hi = alist.size(); 
    listOfLists.add(new ArrayList<T>(alist.subList(lo, hi))); 
    } 
    return listOfLists; 
} 
0

Мне нравится ответ от @laune, но если вы используете Java 8 этого функционального стиля подход может быть использован также, чтобы избежать внешнего зацикливания.

public static <T> List<List<T>> splitJava8(List<T> alist, final int len) { 
    return IntStream.range(0, alist.size()) // Iterate over the whole thing 
      .filter(i -> i % len == 0) // Filter out every 'len' number 
      .boxed() // Create a stream (instead of IntStream) 
      .map(i -> alist.subList(i, Math.min(i + len, alist.size()))) // create sublists 
      .collect(Collectors.toList()); // Collect the whole thing to a list of lists 
} 
-1

У меня была аналогичная проблема.

List<String> masterList = new ArrayList<String>(); 
    List<String> childList = new ArrayList<String>(); 

    int maximumAllowed = 6; 
    int i,j= 0; 


    masterList.add("1"); 
    masterList.add("2"); 
    masterList.add("3"); 
    masterList.add("4"); 
    masterList.add("5"); 
    masterList.add("6"); 
    masterList.add("7"); 
    masterList.add("8"); 
    masterList.add("9"); 
    masterList.add("10"); 
    masterList.add("11"); 
    masterList.add("12"); 
    masterList.add("13"); 
    do{ 
     i=j; 
     j=(maximumAllowed)+j; 
     if(j>=masterList.size()){ 
      childList = masterList.subList(i, masterList.size()); 
      childList.forEach(x -> System.out.println(x)); 
     }else{ 
      childList = masterList.subList(i,j); 
      childList.forEach(x -> System.out.println(x)); 
     } 

    }while(j<masterList.size()); 

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