【问题标题】:create lists from list in java从java中的列表创建列表
【发布时间】:2013-06-01 13:11:37
【问题描述】:

考虑一个包含 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;
            }
        }

感谢和问候

【问题讨论】:

标签: java collections for-loop arraylist


【解决方案1】:

一次只需遍历 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))));
}

【讨论】:

    【解决方案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));
    }
    

    【讨论】:

    • 一个重要的注意事项是subList 返回的List 实际上与原始List 共享相同的后备数组。因此,对子列表的任何修改都会影响到原来的`List.见 docs.oracle.com/javase/6/docs/api/java/util/…, int)>
    【解决方案3】:

    我在网上找到了这个实现,你可以用它把你的数据存储到一个 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();
    }
    }
    

    【讨论】:

    • 这如何解决这个问题?
    • 这给了他一个 2dArrayList 的实现,这将允许他使用提供的方法以表格形式存储他的数据。该算法将与您提供的算法保持一致。这给了他一个实现来存储它。
    【解决方案4】:

    你可以使用它:

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

    【讨论】:

      【解决方案5】:

      类似

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

      【讨论】:

        【解决方案6】:
        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++;
        }
        

        【讨论】:

          【解决方案7】:

          您的方法没问题,其他解决方案也非常好,但您实际上是在对间隔进行硬编码以创建子列表。相反,一个简单的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 作为每个列表所需元素的数量来调用此方法。如果您需要更改要拆分的元素数量,只需将新数量传递给此方法即可。

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-12-08
              • 1970-01-01
              • 2011-10-10
              • 2015-09-08
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多