java for循環(huán)的時(shí)候增加循環(huán)體的長(zhǎng)度是不是不太好的?
問(wèn)題描述
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);} }
比如上面的代碼,如果我沒(méi)有進(jìn)入第二層的for循環(huán)里,我就會(huì)對(duì)list進(jìn)行一個(gè)add的操作。這里應(yīng)該是沒(méi)有問(wèn)題的,因?yàn)槲以诘谝粋€(gè)for循環(huán)體里操作的是第二個(gè)for循環(huán)的size()。我記得有一個(gè)情景是for(){...}我直接在...操作了for的size(),這樣好像是不行的,當(dāng)初好像有一個(gè)什么辦法的,我暫時(shí)想不到了,哪位大神幫我回憶回憶呵??
問(wèn)題解答
回答1:不要用 for(:){},用 for(int i = 0; i < list.size(); i++),小心不要搞成死循環(huán)
回答2:在for each,也就是你的代碼里 for(a : as)的循環(huán)中,不能對(duì)被循環(huán)集合進(jìn)行增加或刪除操作,否則會(huì)報(bào)ConcurrentModificationException.在這段代碼里是沒(méi)有問(wèn)題的。因?yàn)槟愀淖僱ist的操作都是在內(nèi)層循環(huán)之外做的。
看你的需求其實(shí)就是按省統(tǒng)計(jì)各市的數(shù)據(jù)。有條件使用Java 8的話,可以看看Stream的GroupBy方法。可以大大簡(jiǎn)化代碼。
一些不相太干的問(wèn)題,set方法設(shè)置一個(gè)list的方式是不太合適的。
如果是有業(yè)務(wù)邏輯的對(duì)象,應(yīng)該對(duì)內(nèi)部結(jié)構(gòu)進(jìn)行包裝后以業(yè)務(wù)領(lǐng)域的概念提供接口,而不應(yīng)該直接暴露內(nèi)部的集合。
即便是數(shù)據(jù)傳遞對(duì)象,也不應(yīng)該提供集合屬性的set方法。一般而言,私有集合變量的生命周期應(yīng)該由它的父對(duì)象管理。外界通過(guò)外面包裝對(duì)象的add或remove方法操作私有的集合。如果需要提供集合方式的get方法。需要考慮是否要進(jìn)行copy或者使之不可變。
回答3:不能在foreach里操作list(add,remove等操作)
回答4:希望直接跳出兩層循環(huán),無(wú)非是兩種辦法:
用break label的語(yǔ)法(這個(gè)我從沒(méi)用過(guò),可以Google一下);
就是你用的辦法,設(shè)個(gè)標(biāo)志位。
另外,city的復(fù)數(shù)是cities而不是citys。
回答5:這寫(xiě)得啰嗦了。我的話先這樣寫(xiě):
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;}
你的原代碼有幾個(gè)需要優(yōu)化的地方:
盡量避免雙重循環(huán),內(nèi)循環(huán)一般都應(yīng)該提取出來(lái);
對(duì)同一個(gè)變量的操作,代碼行盡可能集中在一起,這樣閱讀起來(lái)更自然;
變量命名應(yīng)當(dāng)表現(xiàn)其業(yè)務(wù)含義和主要類型,比如 List 對(duì)象盡量都用 xxxList 方式命名。這我懶得給你改了。
回答6:不明白你到底問(wèn)什么..是if進(jìn)不去嗎?
回答7:提問(wèn)前先組織好自己的思路,你想問(wèn)的是什么?你希望得到什么回答?不然其他人幫不了你回答。
相關(guān)文章:
1. docker 下面創(chuàng)建的IMAGE 他們的 ID 一樣?這個(gè)是怎么回事????2. macos - mac下docker如何設(shè)置代理3. docker - 如何修改運(yùn)行中容器的配置4. docker gitlab 如何git clone?5. docker api 開(kāi)發(fā)的端口怎么獲取?6. angular.js使用$resource服務(wù)把數(shù)據(jù)存入mongodb的問(wèn)題。7. javascript - 連續(xù)點(diǎn)擊觸發(fā)mouseleave事件8. debian - docker依賴的aufs-tools源碼哪里可以找到啊?9. docker start -a dockername 老是卡住,什么情況?10. dockerfile - 我用docker build的時(shí)候出現(xiàn)下邊問(wèn)題 麻煩幫我看一下

網(wǎng)公網(wǎng)安備