【问题标题】:Object is not being added to a list, list returns empty对象未添加到列表中,列表返回空
【发布时间】:2019-04-17 18:44:04
【问题描述】:

我正在从网站检索数据,当我检索数据(字符串)时,我会得到国家/地区的显示

for (Element row : document.select("table.sortable.wikitable tr")) {

                if (row.select("td:nth-of-type(1)").text().equals("")) {
                    continue;

                }
else {
String name = row.select("td:nth-of-type(1)").text();
System.out.println(name);

}

这给了我控制台中的国家/地区列表,现在我已经验证我正在获取我想要使用列表将每个国家/地区插入单独的国家/地区对象的国家/地区

final String url = "https://en.wikipedia.org/wiki/List_of_sovereign_states";
        List<Country> countries = new ArrayList<>();
        try {
            final Document document = Jsoup.connect(url).get();

            for (Element row : document.select("table.sortable.wikitable tr")) {

                if (row.select("td:nth-of-type(1)").text().equals("")) {
                    continue;

                } else {
                    for (Country country : countries) {

                        country.setCountry(row.select("td:nth-of-type(1)").text());


                        countries.add(country);

                    }

                }
            }
            System.out.println(countries);
        }

当我打印列表时,列表为空

[]

【问题讨论】:

    标签: java for-loop arraylist jsoup


    【解决方案1】:

    问题出在这里:

    else {
        for (Country country : countries) {
            country.setCountry(row.select("td:nth-of-type(1)").text());
            countries.add(country);
        }
    }
    

    想想代码在做什么。当您点击 else 块时,您将循环浏览您的国家列表,并且 . . .创建一个新国家的次数与列表中现有国家的数量一样多。但由于列表开始时为空,因此该循环将永远不会执行。

    解决方案很简单。完全摆脱循环,然后这样做:

    else {
        Country country = new Country();
        country.setCountry(row.select("td:nth-of-type(1)").text());
        countries.add(country);
    }
    

    【讨论】:

      【解决方案2】:

      您正在调用Country country : countries,您想在其中添加一个新国家/地区到列表中,countries 默认不包含任何值,因此它将遍历具有 0 值的列表并且什么也不做。您尚未在任何地方将新国家/地区添加到您的 countries 列表中。

      你可能打算做这样的事情,你正在创建一个 Country 的新实例:

      if (row.select("td:nth-of-type(1)").text().equals("")) {
          continue;
      } else {
          Country country = new Country();
          country.setName(row.select("td:nth-of-type(1)").text());
          countries.add(country);
      }
      

      (以上代码假设td:nth-of-type(1) 包含国家名称,但这只是一个示例)

      【讨论】:

        【解决方案3】:

        您正在迭代国家/地区列表,而不是创建新的 Country 对象。 正如我们的同事所提到的,您应该首先创建 Country 对象的实例,设置其字段,然后将其包含在列表中。我将扩展示例并将国家名称移动到它的构造函数以防止空指针。

        else {
            String countryName = row.select("td:nth-of-type(1)").text();
            Country country = new Country(countryName);
            countries.add(country);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-21
          • 2012-11-08
          相关资源
          最近更新 更多