关于java list循环的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于java list循环的问题相关的知识,希望对你有一定的参考价值。

下面是一个读取excel文件的方法,假设从excel文件中读取出来了3万条数据,按常规是要循环3万次,每循环一次就把一条数据放到一个list中接着再放到一个maplist里。循环完3万次后直接return maplist。现在我要解决的问题是,不要一次性循环3万条,想让循环5000次就return一次。请问有什么办法解决没?循环的次数能灵活点最了。

public Map readExcel()
HSSFWorkbook wb = new HSSFWorkbook(new POIFSFileSystem(inputStream));
HSSFSheet sheet = wb.getSheetAt(0);
Map maplist = new HashMap();
List list = null;
for (int i = 0; i <= sheet.getLastRowNum(); i++) //sheet 取出了3万行数据
list = new ArrayList();
list.add(sheet.getRow(i).getCell(1).getStringCellValue());
list.add(sheet.getRow(i).getCell(2).getStringCellValue());
maplist.put(i, list);

return maplist;

我猜你的想法应该是类似分页的效果,可以根据请求的页数获得数据。
比如:3万行数据,分成6页(当然可以根据每页的数据设置页数),每页5000条数据。
需要第1页的数据,则返回前面的5000条,即 (第1页-1) * 5000 到 第1页 * 5000,这个区间内的数据。依次类推。如果想更加灵活,则动态的设置每页的数据条数。

请求数据的时候,只需要传入相应的页数就好了,即想要那个区间段的数据。
一次一次的请求就可以获得数据了。而且也避免了一次数据过大,占用内存过多。
-----------------------我是华丽的分割线---------------
int all_len = //总数
int page_count = //分页数
int every_page_len = //每页的数据条数
public Map readExcel(int page_index)
...................
int start = (page_index-1)*every_page_len;
int end = page_index*every_page_len;
for(int i=start ; i<end; i++)
......................

return XXX;

-----------------------我是华丽的分割线---------------
思路和简单的实现方式就上面这个样子了,一些错误参数控制什么的,我就不仔细考虑了。
参考技术A 给你提供一个思路,写一个类,给他设置一个属性,比如叫count,初始为0,然后循环5000次返回,将count置为5000,下次再进来,从5000开始循环,也就是从count开始循环,再来5000次,依次类推。
另外,在循环中加一个if语句,用于判断如果count==sheet的总长度的时候,将count重新置为0。本回答被提问者采纳
参考技术B 一个方法肯定只会return一次,你所说的要每5000行返回一次,只能用一个List A装5000行数据之后,再放入到一个List B,再循环5K条放到一个list ,再把list放入B,等全部数据存储完成后返回List B即可。

不过这样做是否真的有意义?
如果你的目的是为了提高性能,估计不能如愿。
一般是通过事务,通过多次调用这个方法来处理数据,每次处理5K条
参考技术C for (int i = 0; i <= sheet.getLastRowNum(); i++) //sheet 取出了3万行数据
list = new ArrayList();
list.add(sheet.getRow(i).getCell(1).getStringCellValue());
list.add(sheet.getRow(i).getCell(2).getStringCellValue());
maplist.put(i, list);

这里的数据结构有问题。只是为了取某一行两个单元格数据,没必要用List,直接封装个简单的pojo就行了。另你想实现的处理5000条(灵活)就返回,那恐怕要用线程了。不过意义不大。追问

当然不止取两个单元格, 我只是做个示例!

追答

那就定义个简单的pojo,用list不合适。

参考技术D 加一个外层循环,外层循环次数为sheet.getLastRowNum()/5000
for(int m = 0;m<sheet.getLastRowNum()/5000;m++)
for(int n = m*5000;n<(m+1)*5000;n++)

以上是关于关于java list循环的问题的主要内容,如果未能解决你的问题,请参考以下文章

关于java中ArrayList的快速失败机制的漏洞——使用迭代器循环时删除倒数第二个元素不会报错

java关于集合的遍历与增强for循环(foreach)的使用

关于 C# 中list<string> 的用法

关于java list的排序问题

java 基础关于 list 集合问题

java程序,关于SQL语句的问题。