完成操作后转义内部循环并转到外部循环

时间:2020-05-29 01:56:55

标签: java arrays for-loop nested-for-loop

BigestCountries类有一个代码。

它由2个数组组成:

df = pd.read_excel('excel_file.xlsx')

data = pd.DataFrame(df, columns=['A', 'B', 'C', 'D', 'E'])


A    B   C    D   E
12  bob  32  abc 123
12  jan  34  fbc  23
14  jan  32  ac  133
12  cat  32  abc 123
list[0] = [[12  bob  32  abc 123]]
list[1] = [[12  jan  34  fbc  23][14  jan  32  ac  133]]
list[2] = [[12  cat  32  abc 123]]

不幸的是,它无法从内部循环中逃脱并将匹配的国家/地区重写为新生成的数组的所有行。 Result

2 个答案:

答案 0 :(得分:1)

方法getCountriesFoundedBetween()可以以不同的方式实现,而无需嵌套循环,如下所示。

private static String[] getCountriesFoundedBetween(int min, int max) {
    if (max < min) {
        throw new IllegalArgumentException("'max' less than 'min'");
    }
    String[] countriesFoundedBetween;
    int countriesMatched = 0;
    int[] indexes = new int[biggestCountries.length];
    if (biggestCountries != null && biggestCountries.length > 0) {
        for (int i = 0; i < biggestCountries.length; i++) {
            if(countryData[i][COUNTRY_AGE_FOUNDED] >= min &&
               countryData[i][COUNTRY_AGE_FOUNDED] <= max) {
                indexes[countriesMatched++] = i;
            }
        }
        countriesFoundedBetween = new String[countriesMatched];
        for (int i = 0; i < countriesMatched; i++) {
            countriesFoundedBetween[i] = biggestCountries[indexes[i]][COUNTRY_NAME];
        }
    }
    else {
        countriesFoundedBetween = new String[0];
    }
    return countriesFoundedBetween;
}

上面的代码还返回了一个空数组,而不是null,这对于返回数组的方法是更可取的。

这是一个使用人口来确定最大国家的完整示例。

public class Countrys {
    private static final int  CHINA      = 0;
    private static final int  INDIA      = 1;
    private static final int  U_S_A      = 2;
    private static final int  INDONESIA  = 3;
    private static final int  PAKISTAN   = 4;
    private static final int  BRAZIL     = 5;
    private static final int  NIGERIA    = 6;
    private static final int  BANGLADESH = 7;
    private static final int  RUSSIA     = 8;
    private static final int  MEXICO     = 9;

    private static final int  COUNTRY_NAME = 0;
    private static final int  COUNTRY_CONTINENT = 1;
    private static final int  COUNTRY_POPULATION = 0;
    private static final int  COUNTRY_AGE_FOUNDED = 1;

    private static int[][] countryData = new int[][]{{1_427_647_786, 1949},
                                                     {1_352_642_280, 1950},
                                                     {  328_239_523, 1776},
                                                     {  273_523_615, 1945},
                                                     {  220_892_340, 1947},
                                                     {  210_147_125, 1889},
                                                     {  206_139_589, 1960},
                                                     {  164_689_383, 1971},
                                                     {  144_384_244, 1991},
                                                     {  128_932_753, 1810}};
    private static String[][] biggestCountries = new String[][]{{"China"     , "Asia"},
                                                                {"India"     , "Asia"},
                                                                {"U.S.A."    , "North America"},
                                                                {"Indonesia" , "Asia"},
                                                                {"Pakistan"  , "Asia"},
                                                                {"Brazil"    , "South America"},
                                                                {"Nigeria"   , "Africa"},
                                                                {"Bangladesh", "Asia"},
                                                                {"Russia"    , "Europe"},
                                                                {"Mexico"    , "North America"}};

    private static String[] getCountriesFoundedBetween(int min, int max) {
        if (max < min) {
            throw new IllegalArgumentException("'max' less than 'min'");
        }
        String[] countriesFoundedBetween;
        int countriesMatched = 0;
        int[] indexes = new int[biggestCountries.length];
        if (biggestCountries != null && biggestCountries.length > 0) {
            for (int i = 0; i < biggestCountries.length; i++) {
                if(countryData[i][COUNTRY_AGE_FOUNDED] >= min &&
                   countryData[i][COUNTRY_AGE_FOUNDED] <= max) {
                    indexes[countriesMatched++] = i;
                }
            }
            countriesFoundedBetween = new String[countriesMatched];
            for (int i = 0; i < countriesMatched; i++) {
                countriesFoundedBetween[i] = biggestCountries[indexes[i]][COUNTRY_NAME];
            }
        }
        else {
            countriesFoundedBetween = new String[0];
        }
        return countriesFoundedBetween;
    }

    public static void main(String[] args) {
        String[] result = getCountriesFoundedBetween(1950, 1980);
        System.out.println(Arrays.toString(result));
    }
}

运行上面的代码将产生以下输出:

[India, Nigeria, Bangladesh]

答案 1 :(得分:0)

  1. 如果您为类BigestCountries命名,它仍然具有属性biggestCountries,该属性是一个数组,其中包含有关最大国家/地区的信息,我认为您没有在利用OO的潜力。
  2. 您可以使用Class来表示Country的数据。使用数据封装,您可以摆脱嵌套数组,从而摆脱嵌套循环和控制流语句(中断,继续等),查找索引常量,保持索引biggestCountriescountryData之间的同步,等等。 / li>
  3. 您的代码两次执行相同的任务。第一个循环计算匹配的国家/地区并初始化数组。第二个循环实际上将匹配的国家/地区名称放入了数组。
  4. Java收集框架提供具有动态大小的数据结构。我在这里使用ArrayList
  5. 我认为ageFound应该命名为yearFound

重构代码

Country.java

public class Country {

    private String name;
    private int population;
    private int yearFound;
    private String continent;

    public Country(String name, String continent, int year, int population) {
        this.name = name;
        this.population = population;
        this.continent = continent;
        this.yearFound = year;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getPopulation() {
        return population;
    }

    public void setPopulation(int population) {
        this.population = population;
    }

    public String getContinent() {
        return continent;
    }

    public void setContinent(String continent) {
        this.continent = continent;
    }

    public int getYearFound() {
        return yearFound;
    }

    public void setYearFound(int yearFound) {
        this.yearFound = yearFound;
    }

    @Override
    public String toString() {
        return "Country [name=" + name + ", population=" + population + ", yearFound=" + yearFound + ", continent="
                + continent + "]";
    }

}

BiggestCountries.java

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class BiggestCountries {

    private List<Country> countries = new ArrayList<Country>() {
        {
            add(new Country("China", "Asia", 1949, 1433783686));
            add(new Country("Canada", "North America", 1867, 37590000));
            add(new Country("United States", "North America", 1776, 328200000));
        }
    };

    public List<Country> getCountriesFoundedBetween(int min, int max) {
        List<Country> matchedCountry = new ArrayList<Country>();
        Iterator<Country> itrCoutnry = countries.iterator();

        while (itrCoutnry.hasNext()) {
            Country country = itrCoutnry.next();
            int yearFound = country.getYearFound();
            if (min < yearFound && max > yearFound) {
                matchedCountry.add(country);
            }
        }
        return matchedCountry;
    }

}

测试运行

public static void main(String[] args) {

    List<Country> matchedCountries = new BiggestCountries().getCountriesFoundedBetween(1700, 1899);
    System.out.println(matchedCountries);
}

结果

[Country [name=Canada, population=37590000, yearFound=1867, continent=North America], Country [name=United States, population=328200000, yearFound=1776, continent=North America]]
相关问题