如何遍历Java中每个对象的对象列表并比较值?

时间:2016-11-26 14:37:21

标签: java arrays list for-loop compare

所以我有 object ,可存储CountryYearValue

然后我List<Object>将存储每年的对象

每个List<object>由每个年度范围的数据组成

我想循环遍历任意数量的国家/地区,让我们说4,然后在每个对象中我想要检索每个value的{​​{1}}。

例如

假设我们希望我们的对象将数据从year返回到1980

所以我的代码看起来像这样:

1983

这可能吗?如果是的话,我怎么能得到它?

由于

2 个答案:

答案 0 :(得分:0)

基于答案: “这只是为了说明我的问题。我的实际应用程序中没有这样的结构。代码上方的数据只是我数据的一个例子”

我建议您创建一个存储该数据的POJO:

class POJO { //add nice name to class!
    private Map<Integer, Double> yearValueMap;
    private String countryName;
    // add setter and getter here.
    add(Integer year, Double value) {
        this.yearValueMap.put(year, value);
    }
}

然后创建存储该数据的对象,如:

POJO pojo = new POJO();
pojo.add(1890, 14.31);
pojo.setCountryName("Italy");

所以你有包含这些数据的对象。那你有一个

List<POJO> countryInformation;

你可以迭代。

希望它有所帮助,而且我没有输入任何拼写错误,我在这里编写了它。

编辑以在评论中添加代码:

List <Object> myData = receiveDataFromApi();
for(int i = 0; i < myData.size(); i+=3) {
    ...
    pojo.setCountryName= myData.get(i);
    pojo.add(myData.get(i+2), myData.get(i+1));
    ...
}

我使用POJO只是为了说明问题,但你应该使用自己的模型。

答案 1 :(得分:0)

宣布你的POJO之后:

public class MyObject {
    Integer year;
    String country;
    BigDecimal value;
    public MyObject(Integer year, String country, BigDecimal value) {
        super();
        this.year = year;
        this.country = country;
        this.value = value;
    }
    //getter/setter
}

在列表中创建并添加了对象值之后:

...
MyObject af1 = new MyObject(1980,"AF",new BigDecimal("19199437988.8023"));
MyObject af2 = new MyObject(1981,"AF",new BigDecimal("20050189881.6659"));
MyObject af3 = new MyObject(1982,"AF",new BigDecimal("20046334303.9661"));
MyObject af4 = new MyObject(1983,"AF",new BigDecimal("20536542736.7297"));
...
MyObject ua1 = new MyObject(1980,"UA",new BigDecimal("90615023323.7353"));
MyObject ua2 = new MyObject(1981,"UA",new BigDecimal("131805126738.287"));
MyObject ua3 = new MyObject(1982,"UA",new BigDecimal("181334417615.413"));
MyObject ua4 = new MyObject(1983,"UA",new BigDecimal("175781379051.433"));
...

List<MyObject> completeList = Arrays.asList(af1,af2,af3,af4,ua1,ua2,ua3,ua4,id1,id2,id3,id4,au1,au2,au3,au4);

您可以使用java8流来获取您正在寻找的内容:

1)过滤原始列表,以便只获取1980<=year<=1983的对象:

int yearFrom =1980;
int yearTo =1983;   
List<MyObject> filteredList = completeList.stream().filter(s -> s.getYear()>=yearFrom && s.getYear()<=yearTo).collect(Collectors.toList());

2)为每个国家/地区获取map(year,value),即AF

Map<Integer, BigDecimal> map = filteredList.stream()
        .filter(s -> ("AF").equals(s.getCountry()))
          .collect(
              Collectors.toMap(
                 s -> ((MyObject)s).getYear(),
                 s -> ((MyObject)s).getValue())
         );
System.out.println("(year,value) for AF Country are:");
System.out.println(map);

您可以通过以下方式获取这样的地图:Map(country,Map(year,value))

Map<String, Map<Integer, BigDecimal>> mapCountries = filteredList.stream()
        .collect(Collectors.groupingBy(MyObject::getCountry,
        Collectors.toMap( 
                s -> s.getYear(),
                s -> s.getValue()))
        );

然后,您可以遍历各个国家/地区并mapCountries.get(country)以获取每个国家/地区的Map(year,value)