suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Ist es nicht sinnvoll, die Länge des Schleifenkörpers zu erhöhen, wenn eine Java-for-Schleife verwendet wird?

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

Wenn ich im obigen Code beispielsweise nicht die zweite Ebene der for-Schleife eingebe, führe ich einen Add-Vorgang für die Liste aus. Hier sollte es kein Problem geben, denn was ich im ersten for-Schleifenkörper bearbeite, ist die size() der zweiten for-Schleife. Ich erinnere mich an eine Situation, in der ich for(){...} direkt die size() von for in bedient habe... Das scheint unmöglich zu sein. Am Anfang schien es einen Weg zu geben, aber ich kann mir das nicht vorstellen Kann mir vorerst irgendein Meister helfen, mich an die Erinnerungen zu erinnern? ?

某草草某草草2708 Tage vor865

Antworte allen(7)Ich werde antworten

  • 过去多啦不再A梦

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

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

    Antwort
    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或者使之不可变。

    Antwort
    0
  • 曾经蜡笔没有小新

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

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

    Antwort
    0
  • 伊谢尔伦

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

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

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

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

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

    Antwort
    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 方式命名。这我懒得给你改了。

    Antwort
    0
  • 为情所困

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

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

    Antwort
    0
  • 滿天的星座

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

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

    Antwort
    0
  • StornierenAntwort