【问题标题】:How i can iterate list to get 10 elements each time in java我如何在java中每次迭代列表以获取10个元素
【发布时间】:2013-08-05 12:41:07
【问题描述】:

我有一个包含 70 个元素的列表。

例如:

List<Long> dbList = new ArrayList<Long>();

dbList 有 70 条记录。如果我将所有记录发送到 MySql 中的查询,则需要很长时间。所以现在我想每次发送 10 个元素到数据库查询。所以我需要以 10 的间隔迭代列表。我该怎么做?这是避免长时间使用IN的好方法吗?

SQL 查询

select model.boothId, model.panchayat.panchayatId
from Table1 model
where model.panchayat.panchayatId in(:locationValues)
  and model.publicationDate.publicationDateId in (:publicationDateIdsList)
  and model.constituency.id = :id group by model.panchayat.panchayatId

提前谢谢...

【问题讨论】:

  • 你能显示你的sql吗?
  • 70 条记录?很长时间?这些是什么?电影文件?
  • 没有没有。只是 1,2,3,5,.....70
  • 通常一次检索 70 个对象比每次 7 次 10 个对象更快。您可以及时获得时间的唯一情况 - 如果您的对象太大并且将它们全部选择在一起会导致内存交换,但我认为情况并非如此。所以总的来说 - 你应该只在两种情况下这样想:
  • @Dmitry 你能解释清楚吗?这不是正确的方式

标签: java mysql list


【解决方案1】:

ArrayList#subList 是一个非常高效的操作。您可以迭代大小为 10 的范围:

for (int i = 0; i < dbList.size(); i += 10) {
   List<Long> sub = dbList.subList(i, Math.min(dbList.size(),i+10)));
   ... query ...
}

【讨论】:

  • 如果我的列表只包含 65 条记录。是否有任何异常我会得到 likw arrayindexout of bounnds 异常
  • Math.min 应该注意边缘情况。
【解决方案2】:

如果你使用Eclipse Collections(以前的GS Collections)并将 dbList 更改为 MutableList 或类似的东西,你可以这样写:

MutableList<Long> dbList = ...;
RichIterable<RichIterable<Long>> chunks = dbList.chunk(10);

如果无法更改 dbList 的返回类型,可以将其包装在 ListAdapter 中。

RichIterable<RichIterable<Long>> chunks = ListAdapter.adapt(dbList).chunk(10);

注意:我是 Eclipse Collections 的提交者。

【讨论】:

  • 我希望 Eclipse Collections 能够取代 JCL。喜欢图书馆!有一个只返回一个 RichIterable 的 .take(10) 会很好。
【解决方案3】:

您可以使用List接口中的subList方法来划分您的列表。

【讨论】:

    【解决方案4】:

    我不知道你到底想做什么,但你可以试试下面的伪代码,如果你用循环构建你的查询:

    counter=0;
    for (Long item : dbList){
        query.add (item);
        if (counter>10){
            query.send();
            counter=0;
        }
    }
    if (!query.empty())
        query.send();
    

    这只是伪代码。可能您没有这样的查询对象,但只是为了解释我的观点。

    希望对你有帮助

    【讨论】:

      【解决方案5】:

      在纯 Java 代码中可能会这样做:

      int parts = list.size()/10;
      
              for(int i=0; i<10; i++){
                  for(int j=0; j<parts; j++){
                      Long l = list.get(j + i*j);
                      // l do sth;
                  }
              }
      

      【讨论】:

        【解决方案6】:

        正如 d'alar'cop 所说,我认为这可能是您的 SQL 语句的问题,而不是列表的问题。但无论如何,我会做这样的事情:

        int i = 1;
        List<Long> newList = new ArrayList<Long>();
        for(Long item : dbList)
            {
                for (i <= 10; i++)
                {
                    newList.Add(item)
        
                    if (i == 10)
                    {
                        //SQL Statement
                        i = 1;
                    }
        
                    break;
                }
        
            }
        

        或者,其他人提到的subList 也可以,并且可能是更紧凑的解决方案。

        【讨论】:

        • == not = for your if... 这也是一个无限循环。我认为您正在考虑的是遍历所有项目。 ex for i
        • 好点。我修复了if 语句的相等性,我认为我用break 修复了无限循环,但肯定有更好的方法来做到这一点。
        • 几乎.....您需要一个计数器来跟踪您使用的物品。现在它输入for each,然后输入下一个计数为10的for。您在一个项目上计数10,将10个项目添加到newList我会打开eclipse并实际逐步执行您的代码,因为您错过了一些关键点。
        • 我的错。我在想break 将是摆脱 for 循环并转到列表中的下一项的快速方法。
        • 是的,仔细考虑程序流程非常重要,现在代码只是用dbList填充newList
        【解决方案7】:

        简单类,其中包含从具有起始索引的列表中返回 10 个元素的函数。

        import java.util.ArrayList;
        import java.util.List;
        
        public class TestTenElement {
        
        public static void main(String[] args) {
            // Getting all the element list from DB -- Here Creating Sample List
            List<Long> myList = new ArrayList<Long>();
        
            // Dummy element list
            for (long i = 0; i < 51; i++) {
                myList.add(i);
            }
        
            // Calling function may be from different class
            System.out.println(getFiveElement(myList, 0)); // First Ten Element from StartIndex 0
            System.out.println(getFiveElement(myList, 10)); // Second Ten Element from StartIndex 5
            // .......
            System.out.println(getFiveElement(myList, 50)); // If Last Iteration Gives remaining elements
        }
        
        // print ten element from list from the start index specified
        public static List<Long> getFiveElement(List<Long> myList, int startIndex) {
            List<Long> sub = new ArrayList<Long>();
        
            sub = myList.subList(startIndex, Math.min(myList.size(), startIndex + 10));
            return sub;
        
        }
        }
        

        【讨论】:

          【解决方案8】:

          下面的代码 sn-p 可能会有所帮助。

               int pointer =0;
               List<Long> chunks = null;
               List<Long> longValues =    LongStream.rangeClosed(1, 100).boxed().collect(Collectors.toList());
               int limit =10;
               do{ 
                       chunks = new ArrayList<>();
                       for(int incrementor =pointer ; incrementor < longValues.size() && incrementor < pointer+limit; incrementor++){
                           chunks.add(longValues.get(incrementor));
                       }
                       if(chunks.size() == limit){
                           pointer = pointer + limit;
                       }
          
                       if(chunks.size() >0){
                           System.out.println(chunks);
                       //your update query goes here
                       }
               }while(chunks.size() ==limit);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-03-12
            • 1970-01-01
            • 2010-12-27
            • 2019-04-18
            • 1970-01-01
            • 1970-01-01
            • 2020-08-27
            • 2021-05-22
            相关资源
            最近更新 更多