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

如何在Java中循环遍历对象列表并比较每个对象中的值?,java,arrays,list,for-loop,compare,Java,Arrays,List,For Loop,Compare,所以我有一个对象,它存储国家,年份和值 然后我有一个列表,它将存储每年的对象 每个列表包含各年份范围的数据 我想遍历任意数量的国家,比如说4个,然后在每个对象中,我想检索每个年份的值 例如 假设我们希望对象返回从1980年到1983年的数据 因此,我的代码如下所示: //我们的数据示例 [AF,19199437988.80231980,AF,20050189881.66591981,AF,20046334303.96611982,AF,20536542736.72971983] [UA,9061

所以我有一个
对象
,它存储
国家
年份

然后我有一个
列表
,它将存储每年的对象

每个
列表
包含各年份范围的数据

我想遍历任意数量的国家,比如说4个,然后在每个对象中,我想检索每个
年份的

例如 假设我们希望对象返回从1980年到1983年的数据

因此,我的代码如下所示:

//我们的数据示例
[AF,19199437988.80231980,AF,20050189881.66591981,AF,20046334303.96611982,AF,20536542736.72971983]
[UA,90615023323.73531980,UA,131805126738.2871981,UA,181334417615.4131982,UA,175781379051.433,1983]
[身份证号码861933968740.3321980,身份证号码890487074595.9661981,身份证号码912524136718.01982,身份证号码917869913364.9161983]
[非盟,1339539063150.011980,非盟,1454675479665.841981,非盟,15639509559269.521982,非盟,1537477830480.511983]
//每种价值观都是一个国家AF’代表阿富汗,等等。。。
字符串[]国家/地区=新字符串[]{
“AF”、“UA”、“ID”、“AU”
};
对于(int i=0;i
这可能吗?如果是这样的话,我怎样才能得到它

谢谢

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

我建议您创建一个存储该数据的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);
    }
}
所以你有包含这些数据的对象。那么你有一个

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));
    ...
}
List myData=receiveDataFromApi();
对于(int i=0;i

我使用POJO只是为了说明这一点,但您应该使用自己的模型。

在您声明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);
您可以通过以下方式获得如下地图:
地图(国家、地图(年份、价值))

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

然后您可以遍历各个国家并进行
mapCountries.get(country)
,以获得每个国家的
Map(year,value)

为什么有这样的结构?为什么不用这些属性构建一个POJO呢?这只是为了说明我的问题。我在实际应用程序中没有这样的结构。代码上面的数据只是我的数据看起来像@FedericoJoséSorenson的一个示例,但是您看到的这些数据实际上是从API接收的。我已经为对象创建了一个类,它将存储国家、年份和价值。然后直接映射它,不是吗?我的意思是,您将得到如下内容:List myData=receiveDataFromApi();对于(inti=0;imap.entrySet().stream().sorted(map.Entry.comparingByKey()).forEach(System.out::println)或降序(1984-1980)
map.entrySet().stream().sorted(map.Entry.comparingByKey().reversed()).forEach(System.out::println)谢谢。还有一件事,我怎样才能用地图去穿越每个国家,而不是“AF”?看看最后一个请求的答案;)哈哈!抱歉,请通读整件事。:)谢谢你,巴德。伟大的冠军!
int yearFrom =1980;
int yearTo =1983;   
List<MyObject> filteredList = completeList.stream().filter(s -> s.getYear()>=yearFrom && s.getYear()<=yearTo).collect(Collectors.toList());
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<String, Map<Integer, BigDecimal>> mapCountries = filteredList.stream()
        .collect(Collectors.groupingBy(MyObject::getCountry,
        Collectors.toMap( 
                s -> s.getYear(),
                s -> s.getValue()))
        );