您的位置:首页技术文章
文章详情页

java for循环的时候增加循环体的长度是不是不太好的?

浏览:61日期:2023-10-23 17:57:45

问题描述

for(CityDataVO cityItem: citys){boolean flag =false;for(ProvinceDataVO proItem : list){ xxxxxx flag = true; break;}if(!flag){ ProvinceDataVO province = new ProvinceDataVO(); province.setProvinceId(cityItem.getProvinceId()); province.setProvinceName(cityItem.getProvinceName()); province.setReportNum(cityItem.getCount()); List<CityDataVO> vo = new ArrayList<>(); vo.add(cityItem); province.setCityData(vo); list.add(province);} }

比如上面的代码,如果我没有进入第二层的for循环里,我就会对list进行一个add的操作。这里应该是没有问题的,因为我在第一个for循环体里操作的是第二个for循环的size()。我记得有一个情景是for(){...}我直接在...操作了for的size(),这样好像是不行的,当初好像有一个什么办法的,我暂时想不到了,哪位大神帮我回忆回忆呵??

问题解答

回答1:

不要用 for(:){},用 for(int i = 0; i < list.size(); i++),小心不要搞成死循环

回答2:

在for each,也就是你的代码里 for(a : as)的循环中,不能对被循环集合进行增加或删除操作,否则会报ConcurrentModificationException.在这段代码里是没有问题的。因为你改变list的操作都是在内层循环之外做的。

看你的需求其实就是按省统计各市的数据。有条件使用Java 8的话,可以看看Stream的GroupBy方法。可以大大简化代码。

一些不相太干的问题,set方法设置一个list的方式是不太合适的。

如果是有业务逻辑的对象,应该对内部结构进行包装后以业务领域的概念提供接口,而不应该直接暴露内部的集合。

即便是数据传递对象,也不应该提供集合属性的set方法。一般而言,私有集合变量的生命周期应该由它的父对象管理。外界通过外面包装对象的add或remove方法操作私有的集合。如果需要提供集合方式的get方法。需要考虑是否要进行copy或者使之不可变。

回答3:

不能在foreach里操作list(add,remove等操作)

回答4:

希望直接跳出两层循环,无非是两种办法:

用break label的语法(这个我从没用过,可以Google一下);

就是你用的办法,设个标志位。

另外,city的复数是cities而不是citys。

回答5:

这写得啰嗦了。我的话先这样写:

for (CityDataVO cityItem: citys){ if (validateCityItem(cityItem, list)) {continue; } List<CityDataVO> vo = new ArrayList<>(); vo.add(cityItem); ProvinceDataVO province = new ProvinceDataVO(); province.setProvinceId(cityItem.getProvinceId()); province.setProvinceName(cityItem.getProvinceName()); province.setReportNum(cityItem.getCount());province.setCityData(vo);list.add(province);}...private boolean validateCityItem(CityDataVO cityItem, List<ProvinceDataVO> list) { for(ProvinceDataVO proItem : list){if (...) { return true;} }return false;}

你的原代码有几个需要优化的地方:

尽量避免双重循环,内循环一般都应该提取出来;

对同一个变量的操作,代码行尽可能集中在一起,这样阅读起来更自然;

变量命名应当表现其业务含义和主要类型,比如 List 对象尽量都用 xxxList 方式命名。这我懒得给你改了。

回答6:

不明白你到底问什么..是if进不去吗?

回答7:

提问前先组织好自己的思路,你想问的是什么?你希望得到什么回答?不然其他人帮不了你回答。

标签: java
相关文章: