[英]create lists from list in java
考慮具有60個或更多元素的列表。 我想將其分為6個列表,然后將其添加到列表中。 我這樣做是因為我想以表格格式將數據發送到jsp。 無論如何,我正在這樣做,但想知道我的工作方式是否良好,因為我相信更好的存在。 下面是我的代碼。
List<String> rollsAll = // from db
List<List<String>> rolls = new ArrayList<List<String>>();
int i=0;
for(String roll:rollsAll){
if(i<10)
{
if(i==0)
{
rolls.add(new ArrayList());
}
rolls.get(0).add(roll);
i++;
continue;
}
else if(i<20)
{
if(i==10)
{
rolls.add(new ArrayList());
}
rolls.get(1).add(roll);
i++;
continue;
}
else if(i<30)
{
if(i==20)
{
rolls.add(new ArrayList());
}
rolls.get(2).add(roll);
i++;
continue;
}else if(i<40)
{
if(i==30)
{
rolls.add(new ArrayList());
}
rolls.get(3).add(roll);
i++;
continue;
}else if(i<50)
{
if(i==40)
{
rolls.add(new ArrayList());
}
rolls.get(4).add(roll);
i++;
continue;
}else if(i<60)
{
if(i==50)
{
rolls.add(new ArrayList());
}
rolls.get(5).add(roll);
i++;
continue;
}else if(i<70)
{
if(i==60)
{
rolls.add(new ArrayList());
}
rolls.get(6).add(roll);
i++;
continue;
}else if(i<80)
{
if(i==70)
{
rolls.add(new ArrayList());
}
rolls.get(7).add(roll);
i++;
continue;
}else if(i<90)
{
if(i==80)
{
rolls.add(new ArrayList());
}
rolls.get(8).add(roll);
i++;
continue;
}else if(i<100)
{
if(i==90)
{
rolls.add(new ArrayList());
}
rolls.get(9).add(roll);
i++;
continue;
}else if(i<110)
{
if(i==100)
{
rolls.add(new ArrayList());
}
rolls.get(10).add(roll);
i++;
continue;
}else if(i<120)
{
if(i==110)
{
rolls.add(new ArrayList());
}
rolls.get(11).add(roll);
i++;
continue;
}
}
謝謝並恭祝安康
只需一次遍歷列表10個項目,然后使用List.subList
來獲取所需的塊。
下面的代碼執行此操作,並防御性地復制子列表。
int nPerSublist = 10;
List<String> rollsAll = // from db
List<List<String>> rolls = new ArrayList<List<String>>(
(rollsAll.size() + nPerSublist - 1) / nPerSublist);
for (int i = 0, n = rollsAll.size(); i < n; i += nPerSublist) {
rolls.add(new ArrayList<String>(rollsAll.subList(i, Math.min(i + nPerSublist, n))));
}
使用List.subList
將產生一種優雅的方式來實現您想要的:
假設我有一個1000個數字的清單,我想將它們分成70個組:
List<Integer> numbers = new ArrayList<Integer>();
for (int i = 1; i <= 1000; i++) {
numbers.add(Integer.valueOf(i));
}
int totalItems = numbers.size();
int itemPerGroup = 70;
int totalGroup = (totalItems / itemPerGroup) + 1;
List<List<Integer>> groups = new ArrayList<List<Integer>>();
for (int groupCount = 1; groupCount <= totalGroup; groupCount++) {
int groupStartIndex = (groupCount - 1) * itemPerGroup;
int groupEndIndex = Math.min(numbers.size(), groupCount * itemPerGroup);
groups.add(numbers.subList(groupStartIndex, groupEndIndex));
}
我在網上找到了此實現,可以將其存儲到2dArrayList中,並將其作為類添加到項目中,然后可以在其中使用方法:
import java.util.ArrayList;
public class ArrayList2d<Type>
{
ArrayList<ArrayList<Type>> array;
public ArrayList2d()
{
array = new ArrayList<ArrayList<Type>>();
}
/**
* ensures a minimum capacity of num rows. Note that this does not guarantee
* that there are that many rows.
*
* @param num
*/
public void ensureCapacity(int num)
{
array.ensureCapacity(num);
}
/**
* Ensures that the given row has at least the given capacity. Note that
* this method will also ensure that getNumRows() >= row
*
* @param row
* @param num
*/
public void ensureCapacity(int row, int num)
{
ensureCapacity(row);
while (row < getNumRows())
{
array.add(new ArrayList<Type>());
}
array.get(row).ensureCapacity(num);
}
/**
* Adds an item at the end of the specified row. This will guarantee that at least row rows exist.
*/
public void Add(Type data, int row)
{
ensureCapacity(row);
while(row >= getNumRows())
{
array.add(new ArrayList<Type>());
}
array.get(row).add(data);
}
public Type get(int row, int col)
{
return array.get(row).get(col);
}
public void set(int row, int col, Type data)
{
array.get(row).set(col,data);
}
public void remove(int row, int col)
{
array.get(row).remove(col);
}
public boolean contains(Type data)
{
for (int i = 0; i < array.size(); i++)
{
if (array.get(i).contains(data))
{
return true;
}
}
return false;
}
public int getNumRows()
{
return array.size();
}
public int getNumCols(int row)
{
return array.get(row).size();
}
}
您可以使用:
private static final int SIZE = 10; // size of an inner list
public List<List<String>> partition(final List<String> rolls)
{
final List<List<String>> ret = new ArrayList<List<String>>();
List<String> list;
int i = 0;
for (final String roll: rolls) {
if (i % SIZE == 0) {
list = new ArrayList<String>();
ret.add(list);
}
list.add(roll);
i++;
}
return ret;
}
就像是
List<String> rollsAll = // from db
List<List<String>> rolls = new ArrayList<List<String>>();
int size = rollsAll.size();
for (int i = 0; i < size / 10; i++) {
rolls.add(new ArrayList<String>(rollsAll.subList(10*i, 10*(i+1)));
}
// handle last part if size not divisible by 10
if (size % 10 > 0) {
rolls.add(new ArrayList<String>(rollsAll.subList(10 * (size / 10), size)));
}
List<List<String>> rolls = new ArrayList<List<String>>();
int i=0;
int currentArrayIndex = 0;
List<String> currentArray = null;
for(String roll:rollsAll){
if( (currentArrayIndex = i %10 ) ==0)
rolls.add(currentArray = new ArrayList());
currentArray.add(roll); i++;
}
您的方法還可以,其他解決方案也很好,但是實際上您正在對間隔進行硬編碼以創建子列表。 取而代之的是,一個簡單的counter
和一個elementsPerList
變量可以將您的代碼簡化為更通用的東西:
public List<List<String>> splitList(List<String> original, int elementsPerList) {
List<List<String>> result = new ArrayList<List<String>>();
List<String> current = new ArrayList<String>();
result.add(current);
for(int i = 0; i < original.size(); i++) {
if(i < result.size() * elementsPerList) {
current.add(original.get(0));
} else {
current = new ArrayList<String>();
result.add(current);
current.add(original.get(0));
}
}
return result;
}
您只需要在當前列表中調用此方法,每個列表中需要的元素數為10
。 如果您需要更改要拆分的元素數量,則只需將新數量傳遞給此方法。
List oldList = new LinkedList<String>();
// Add your elements in oldList
List newList1 = oldList.subList(0, 5);
List newList2 = oldList.subList(6, 10);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.