ArrayList 方法逻辑问题

ArrayList method logic issue

我正在尝试执行我的 ArrayList 方法,但它似乎只获取了第一个数据。

    public class CoronavirusUpdateMain  {
    
    public static void main(String []args) {

        Scanner input = new Scanner(System.in);
        
        System.out.println();
        Scrape sp = new Scrape();
        ArrayList<Country>countryData = sp.getCountryData();
        System.out.println(countryData);
    }
}

我尝试执行的方法是 countryData,当我在测试中 运行 它收集所有数据,但当我在 main 中调用该方法时,它只包含 1 个值。

    final static String url = "https://www.worldometers.info/coronavirus/";
    static ArrayList <Country> countryData = new ArrayList<Country>();

    public static ArrayList<Country> getCountryData(){
        try {
            ArrayList<Country>countryData = new ArrayList<Country>();
             Document doc = Jsoup.connect(url).get();
             Elements table = doc.select("#main_table_countries_today");
             Elements rows = table.select("tbody").select("tr");
             int idx = 0;
             for (Element row : rows) {
                 Elements eachCountry = row.select("td");
                 Country curr = new Country();
                 curr.setId(idx++);
                 curr.setCountry(eachCountry.get(1).text());            
                 curr.setTotalCases(eachCountry.get(2).text());
                 curr.setNewCases(eachCountry.get(3).text());
                 curr.setTotalDeaths(eachCountry.get(4).text());
                 curr.setNewDeaths(eachCountry.get(5).text());
                 curr.setTotalRecovered(eachCountry.get(6).text());
                 curr.setActiveCases(eachCountry.get(7).text());
                 curr.setSeriousCases(eachCountry.get(8).text());
                 curr.setTotalCasesPerMillionPop(eachCountry.get(9).text());
                 curr.setTotalDeathsPerMillionPop(eachCountry.get(10).text());
                 curr.setTotalTests(eachCountry.get(11).text());
                 curr.setTestsPerMillion(eachCountry.get(12).text());
                 curr.setPop(eachCountry.get(13).text());                
                 countryData.add(curr);  
             }
          }catch (IOException e) {
                 e.printStackTrace();
                 return null;
         }
        return countryData;
    }

这是我调用方法时main的结果

[Countryidx=0, country='North America', totalCases='1,739,671', newCases='+3,575', totalDeaths='106,293', newDeaths='+351', totalRecovered='455,831', activeCases='1,177,547', seriousCases='18,422', totalCasesPerMillionPop='', totalDeathsPerMillionPop='', totalTests='', testsPerMillion='', population='']

这是我在另一个main

中测试运行的结果

Countryidx=0, country='North America', totalCases='1,739,671', newCases='+3,575', totalDeaths='106,293', newDeaths='+351', totalRecovered='455,831', activeCases='1,177,547', seriousCases='18,422', totalCasesPerMillionPop='', totalDeathsPerMillionPop='', totalTests='', testsPerMillion='', population='' Countryidx=1, country='Europe', totalCases='1,825,534', newCases='+10,096', totalDeaths='164,790', newDeaths='+216', totalRecovered='805,583', activeCases='855,161', seriousCases='11,117', totalCasesPerMillionPop='', totalDeathsPerMillionPop='', totalTests='', testsPerMillion='', population='' Countryidx=2, country='South America', totalCases='488,006', newCases='+349', totalDeaths='25,493', newDeaths='+15', totalRecovered='177,003', activeCases='285,510', seriousCases='10,599', totalCasesPerMillionPop='', totalDeathsPerMillionPop='', totalTests='', testsPerMillion='', population='' Countryidx=3, country='Asia', totalCases='848,074', newCases='+6,952', totalDeaths='25,601', newDeaths='+101', totalRecovered='488,138', activeCases='334,335', seriousCases='4,961', totalCasesPerMillionPop='', totalDeathsPerMillionPop='', totalTests='', testsPerMillion='', population='' Countryidx=4, country='Africa', totalCases='93,444', newCases='+216', totalDeaths='2,926', newDeaths='+2', totalRecovered='36,971', activeCases='53,547', seriousCases='287', totalCasesPerMillionPop='', totalDeathsPerMillionPop='', totalTests='', testsPerMillion='', population='' Countryidx=5, country='Oceania', totalCases='8,686', newCases='+11', totalDeaths='121', newDeaths='', totalRecovered='7,990', activeCases='575', seriousCases='10', totalCasesPerMillionPop='', totalDeathsPerMillionPop='', totalTests='', testsPerMillion='', population='' Countryidx=6, country='', totalCases='721', newCases='', totalDeaths='15', newDeaths='', totalRecovered='651', activeCases='55', seriousCases='4', totalCasesPerMillionPop='', totalDeathsPerMillionPop='', totalTests='', testsPerMillion='', population='' Countryidx=7, country='World', totalCases='5,004,136', newCases='+21,199', totalDeaths='325,239', newDeaths='+685', totalRecovered='1,972,167', activeCases='2,706,730', seriousCases='45,400', totalCasesPerMillionPop='642', totalDeathsPerMillionPop='41.7', totalTests='', testsPerMillion='', population='' Countryidx=8, country='USA', totalCases='1,571,018', newCases='+435', totalDeaths='93,542', newDeaths='+9', totalRecovered='361,227', activeCases='1,116,249', seriousCases='17,249', totalCasesPerMillionPop='4,749', totalDeathsPerMillionPop='283', totalTests='12,647,099', testsPerMillion='38,234', population='330,779,957' Countryidx=9, country='Russia', totalCases='308,705', newCases='+8,764', totalDeaths='2,972', newDeaths='+135', totalRecovered='85,392', activeCases='220,341', seriousCases='2,300', totalCasesPerMillionPop='2,115', totalDeathsPerMillionPop='20', totalTests='7,500,000', testsPerMillion='51,395', population='145,927,463' Countryidx=10, country='Spain', totalCases='278,803', newCases='', totalDeaths='27,778', newDeaths='', totalRecovered='196,958', activeCases='54,067', seriousCases='1,152', totalCasesPerMillionPop='5,963', totalDeathsPerMillionPop='594', totalTests='3,037,840', testsPerMillion='64,977', population='46,752,753' Countryidx=11, country='Brazil', totalCases='271,885', newCases='', totalDeaths='17,983', newDeaths='', totalRecovered='106,794', activeCases='147,108', seriousCases='8,318', totalCasesPerMillionPop='1,280', totalDeathsPerMillionPop='85', totalTests='735,224', testsPerMillion='3,462', population='212,385,054' Countryidx=12, country='UK', totalCases='248,818', newCases='', totalDeaths='35,341', newDeaths='', totalRecovered='N/A', activeCases='N/A', seriousCases='1,559', totalCasesPerMillionPop='3,667', totalDeathsPerMillionPop='521', totalTests='2,772,552', testsPerMillion='40,866', population='67,845,213' Countryidx=13, country='Italy', totalCases='226,699', newCases='', totalDeaths='32,169', newDeaths='', totalRecovered='129,401', activeCases='65,129', seriousCases='716', totalCasesPerMillionPop='3,749', totalDeathsPerMillionPop='532', totalTests='3,104,524', testsPerMillion='51,338', population='60,471,682' Countryidx=14, country='France', totalCases='180,809', newCases='', totalDeaths='28,022', newDeaths='', totalRecovered='62,563', activeCases='90,224', seriousCases='1,894', totalCasesPerMillionPop='2,771', totalDeathsPerMillionPop='429', totalTests='1,384,633', testsPerMillion='21,218', population='65,257,220' Countryidx=15, country='Germany', totalCases='177,842', newCases='+15', totalDeaths='8,193', newDeaths='', totalRecovered='156,900', activeCases='12,749', seriousCases='1,115', totalCasesPerMillionPop='2,123', totalDeathsPerMillionPop='98', totalTests='3,147,771', testsPerMillion='37,584', population='83,753,585' Countryidx=16, country='Turkey', totalCases='151,615', newCases='', totalDeaths='4,199', newDeaths='', totalRecovered='112,895', activeCases='34,521', seriousCases='882', totalCasesPerMillionPop='1,800', totalDeathsPerMillionPop='50', totalTests='1,675,517', testsPerMillion='19,892', population='84,232,553' Countryidx=17, country='Iran', totalCases='124,603', newCases='', totalDeaths='7,119', newDeaths='', totalRecovered='97,173', activeCases='20,311', seriousCases='2,698', totalCasesPerMillionPop='1,486', totalDeathsPerMillionPop='85', totalTests='716,176', testsPerMillion='8,540', population='83,865,579' Countryidx=18, country='India', totalCases='106,886', newCases='+411', totalDeaths='3,303', newDeaths='+1', totalRecovered='42,309', activeCases='61,274', seriousCases='', totalCasesPerMillionPop='78', totalDeathsPerMillionPop='2', totalTests='2,512,388', testsPerMillion='1,823', population='1,378,418,813' Countryidx=19, country='Peru', totalCases='99,483', newCases='', totalDeaths='2,914', newDeaths='', totalRecovered='36,524', activeCases='60,045', seriousCases='883', totalCasesPerMillionPop='3,022', totalDeathsPerMillionPop='89', totalTests='679,582', testsPerMillion='20,645', population='32,917,154' Countryidx=20, country='Canada', totalCases='79,112', newCases='', totalDeaths='5,912', newDeaths='', totalRecovered='40,050', activeCases='33,150', seriousCases='502', totalCasesPerMillionPop='2,098', totalDeathsPerMillionPop='157', totalTests='1,339,971', testsPerMillion='35,540', population='37,703,672' Countryidx=21, country='Saudi Arabia', totalCases='59,854', newCases='', totalDeaths='329', newDeaths='', totalRecovered='31,634', activeCases='27,891', seriousCases='251', totalCasesPerMillionPop='1,722', totalDeathsPerMillionPop='9', totalTests='618,084', testsPerMillion='17,787', population='34,748,812' Countryidx=22, country='Belgium', totalCases='55,983', newCases='+192', totalDeaths='9,150', newDeaths='+42', totalRecovered='14,847', activeCases='31,986', seriousCases='313', totalCasesPerMillionPop='4,833', totalDeathsPerMillionPop='790', totalTests='720,228', testsPerMillion='62,175', population='11,583,877' Countryidx=23, country='Mexico', totalCases='54,346', newCases='+2,713', totalDeaths='5,666', newDeaths='+334', totalRecovered='37,325', activeCases='11,355', seriousCases='378', totalCasesPerMillionPop='422', totalDeathsPerMillionPop='44', totalTests='185,755', testsPerMillion='1,442', population='128,773,952' Countryidx=24, country='Chile', totalCases='49,579', newCases='', totalDeaths='509', newDeaths='', totalRecovered='21,507', activeCases='27,563', seriousCases='876', totalCasesPerMillionPop='2,596', totalDeathsPerMillionPop='27', totalTests='397,200', testsPerMillion='20,799', population='19,097,135' Countryidx=25, country='Pakistan', totalCases='45,898', newCases='+1,932', totalDeaths='985', newDeaths='+46', totalRecovered='13,101', activeCases='31,812', seriousCases='111', totalCasesPerMillionPop='208', totalDeathsPerMillionPop='4', totalTests='414,254', testsPerMillion='1,880', population='220,368,526' Countryidx=26, country='Netherlands', totalCases='44,249', newCases='', totalDeaths='5,715', newDeaths='', totalRecovered='N/A', activeCases='N/A', seriousCases='293', totalCasesPerMillionPop='2,583', totalDeathsPerMillionPop='334', totalTests='302,395', testsPerMillion='17,652', population='17,130,596' Countryidx=27, country='Qatar', totalCases='35,606', newCases='', totalDeaths='15', newDeaths='', totalRecovered='5,634', activeCases='29,957', seriousCases='172', totalCasesPerMillionPop='12,384', totalDeathsPerMillionPop='5', totalTests='166,182', testsPerMillion='57,799', population='2,875,180' Countryidx=28, country='Ecuador', totalCases='34,151', newCases='', totalDeaths='2,839', newDeaths='', totalRecovered='3,457', activeCases='27,855', seriousCases='221', totalCasesPerMillionPop='1,939', totalDeathsPerMillionPop='161', totalTests='98,171', testsPerMillion='5,574', population='17,610,964' Countryidx=29, country='Belarus', totalCases='31,508', newCases='', totalDeaths='175', newDeaths='', totalRecovered='10,620', activeCases='20,713', seriousCases='92', totalCasesPerMillionPop='3,334', totalDeathsPerMillionPop='19', totalTests='375,076', testsPerMillion='39,692', population='9,449,669' Countryidx=30, country='Sweden', totalCases='30,799', newCases='', totalDeaths='3,743', newDeaths='', totalRecovered='4,971', activeCases='22,085', seriousCases='287', totalCasesPerMillionPop='3,052', totalDeathsPerMillionPop='371', totalTests='209,900', testsPerMillion='20,799', population='10,092,027' Countryidx=31, country='Switzerland', totalCases='30,618', newCases='', totalDeaths='1,891', newDeaths='', totalRecovered='27,700', activeCases='1,027', seriousCases='57', totalCasesPerMillionPop='3,541', totalDeathsPerMillionPop='219', totalTests='350,099', testsPerMillion='40,486', population='8,647,311' Countryidx=32, country='Portugal', totalCases='29,432', newCases='', totalDeaths='1,247', newDeaths='', totalRecovered='6,431', activeCases='21,754', seriousCases='101', totalCasesPerMillionPop='2,885', totalDeathsPerMillionPop='122', totalTests='662,375', testsPerMillion='64,939', population='10,199,983'

这是方法中的更新代码。必须删除静态,因为它不会更改 ArrayList 的值,我还必须删除 2 个不必要的 return,因为它不会 return 完整 ArrayList.


    public ArrayList<Country> getCountryData(){
        ArrayList<Country>countryData = new ArrayList<Country>();
        try {
        
             Document doc = Jsoup.connect(url).get();
             Elements table = doc.select("#main_table_countries_today");
             Elements rows = table.select("tbody").select("tr");
             int idx = 0;
             for (Element row : rows) {
                 Elements eachCountry = row.select("td");
                 Country curr = new Country();
                 curr.setId(idx++);
                 curr.setCountry(eachCountry.get(1).text());            
                 curr.setTotalCases(eachCountry.get(2).text());
                 curr.setNewCases(eachCountry.get(3).text());
                 curr.setTotalDeaths(eachCountry.get(4).text());
                 curr.setNewDeaths(eachCountry.get(5).text());
                 curr.setTotalRecovered(eachCountry.get(6).text());
                 curr.setActiveCases(eachCountry.get(7).text());
                 curr.setSeriousCases(eachCountry.get(8).text());
                 curr.setTotalCasesPerMillionPop(eachCountry.get(9).text());
                 curr.setTotalDeathsPerMillionPop(eachCountry.get(10).text());
                 curr.setTotalTests(eachCountry.get(11).text());
                 curr.setTestsPerMillion(eachCountry.get(12).text());
                 curr.setPop(eachCountry.get(13).text());                
                 countryData.add(curr);
              
             }
         }catch (IOException e) {
                 e.printStackTrace();
         }
        return countryData;
    }

您正在 return 在第一次迭代后从 for 循环中编辑列表。 countryData.add(curr); return 国家数据; 在 catch 语句之后的循环末尾,您应该 return 。 这将在 returning.

之前将所有元素添加到列表中

修改如下:

//static ArrayList <Country> countryData = new ArrayList<Country>();<--- Remove this

public static ArrayList<Country> getCountryData(){
    ArrayList<Country>countryData = new ArrayList<Country>(); //<--- Move it from within the try...catch block to here
    try {        
        Document doc = Jsoup.connect(url).get();
        //...
    } catch (IOException e) {
        e.printStackTrace();
        // return null; <--- Remove this
    }
    return countryData;
}

说明(感谢):

局部变量countryData隐藏了同名的static变量,但只在try-block内部,因此原来的returncountryData()实际上returns static 列表,给定代码为空。