首頁  >  問答  >  主體

java for迴圈的時候增加迴圈體的長度是不是不太好的?

   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(),這樣好像是不行的,當初好像有一個什麼辦法的,我暫時想不到了,哪位大神幫我回憶回憶呵? ?

某草草某草草2669 天前804

全部回覆(7)我來回復

  • 过去多啦不再A梦

    过去多啦不再A梦2017-06-28 09:25:52

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

    回覆
    0
  • 大家讲道理

    大家讲道理2017-06-28 09:25:52

    在for each,也就是你的程式碼裡 for(a : as)的迴圈中,不能對被迴圈集合進行增加或刪除操作,否則會報ConcurrentModificationException.
    在這段程式碼裡是沒有問題的。因為你改變list的操作都是在內層循環之外做的。

    看你的需求其實就是依省統計各市的數據。有條件使用Java 8的話,可以看看Stream的GroupBy方法。可以大大簡化程式碼。

    一些不相太乾的問題,set方法設定一個list的方式是不太合適的。

    • 如果是有業務邏輯的對象,應該對內部結構進行包裝後以業務領域的概念提供接口,而不應該直接暴露內部的集合。

    • 即便是資料傳遞對象,也不應該提供集合屬性的set方法。一般而言,私有集合變數的生命週期應該由它的父物件管理。外界透過外麵包裝物件的add或remove方法操作私有的集合。如果需要提供集合方式的get方法。需要考慮是否要進行copy或使其不可變。

    回覆
    0
  • 曾经蜡笔没有小新

    曾经蜡笔没有小新2017-06-28 09:25:52

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

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-06-28 09:25:52

    希望直接跳出兩層循環,無非是兩種辦法:

    1. br​​eak label的文法(這我從來沒用過,可以Google一下);

    2. 就是你用的辦法,設個標誌位。

    另外,city的複數是cities而不是citys

    回覆
    0
  • 世界只因有你

    世界只因有你2017-06-28 09:25:52

    這寫得囉嗦了。我的話先這樣寫:

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

    你的原始程式碼有幾個需要最佳化的地方:

    1. 盡量避免雙重循環,內循環一般都應該提取出來;

    2. 對同一個變數的操作,程式碼行盡可能集中在一起,這樣閱讀起來更自然;

    3. 變數命名應當表現其業務意義和主要類型,例如 List 物件盡量都用 xxxList 方式命名。這我懶得幫你改了。

    回覆
    0
  • 为情所困

    为情所困2017-06-28 09:25:52

    不懂你到底問什麼..是if進不去嗎?

    回覆
    0
  • 滿天的星座

    滿天的星座2017-06-28 09:25:52

    提問前先組織好自己的思路,你想問的是什麼?你希望得到什麼答案?不然其他人幫不了你回答。

    回覆
    0
  • 取消回覆