2013-06-05 164 views
0

考慮具有60個或更多元素的列表。我想把它分解成6個List並將它們添加到List中。我這樣做是因爲我想以表格格式將數據發送給jsp。無論如何,我這樣做,但想知道我在做的方式是否好,因爲我相信有更好的存在。以下是我的代碼。從java列表中創建列表

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

感謝和問候

+2

爲什麼不你使用另一個'for'循環而不是寫** 12次**相同的片段? – BackSlash

+1

你可以使用subList(int fromIndex,int toIndex)... http://docs.oracle.com/javase/6/docs/api/java/util/List.html#subList(int,int) – Zerkz

+0

謝謝你們。這使我的一天:) – Aadam

回答

2

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

+1使得它非常清晰和簡單:) – Aadam

+0

一個重要的注意事項是'subList'返回的'List'實際上共享了原始'List'的相同支持數組。因此,對子列表的任何修改都會影響原始的List。參見 Genzer

1

我發現,您可以使用您的數據存儲到一個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(); 
} 
} 
+0

這是如何解決這個問題? –

+0

這給了他一個2dArrayList的實現,允許他使用提供的方法以表格形式存儲他的數據。該算法將保持與您提供的相同。這給了他一個實現來存儲它。 –

0

使用subList(fromIndex, toIndex)

List oldList = new LinkedList<String>(); 
// Add your elements in oldList 
List newList1 = oldList.subList(0, 5); 
List newList2 = oldList.subList(6, 10); 
1

您可以使用:

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; 
} 
3

只需一次列出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)))); 
} 
+1

+1使用子列表。 –

1

喜歡的東西

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

+1使用subList。 –

1
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++; 
} 
1

你的方法是確定的和其他解決方案是非常好的,但是你實際上是硬編碼的間隔來創建子列表。相反,一個簡單的counterelementsPerList變量可能會降低代碼的東西更通用:

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爲每個列表所需元素的量。如果您需要更改要拆分的元素數量,則只需將新金額傳遞給此方法即可。