【问题标题】:How to loop through List of objects of and compare value in every object in Java?java - 如何遍历Java中每个对象的对象列表并比较其值?
【发布时间】:2017-04-10 16:59:42
【问题描述】:

所以我有一个 object 来存储 CountryYearValue

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

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

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

例如

假设我们希望我们的对象返回从19801983 的数据

所以我的代码如下所示:

//Example of our data
[AF, 19199437988.8023, 1980, AF, 20050189881.6659, 1981, AF, 20046334303.9661, 1982, AF, 20536542736.7297, 1983]
[UA, 90615023323.7353, 1980, UA, 131805126738.287, 1981, UA, 181334417615.413, 1982, UA, 175781379051.433, 1983]
[ID, 861933968740.332, 1980, ID, 890487074595.966, 1981, ID, 912524136718.019, 1982, ID, 917869913364.916, 1983]
[AU, 1339539063150.01, 1980, AU, 1454675479665.84, 1981, AU, 1563950959269.52, 1982, AU, 1537477830480.51, 1983]

// each value is a country. 'AF' stands for AFghanistan, and so on...
String[] countries = new String[] {
  "AF", "UA", "ID", "AU"
};

for (int i = 0; i < countries.length; ++i) {
  if (countries.get(i).getYear() == "I don't know how to retrieve each year here.") {
    System.out.println(countries.get(i));
  }
}

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

谢谢

【问题讨论】:

  • 为什么会有这样的结构?为什么不使用这些属性构建 POJO?
  • 这只是为了说明我的问题。在我的实际应用程序中,我没有这样的结构。代码上方的数据只是我的数据看起来像@FedericoJoséSorenson 的示例

标签: java arrays list for-loop compare


【解决方案1】:

在你声明你的 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&lt;=year&lt;=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)

【讨论】:

  • 打印的时候怎么顺序错了?所以第一年从 1984 年开始,最后打印 1980 年。如果我给出从 1980 年到 2015 年的年份
  • 您可以按升序(从 1980 到 1984)导航和打印地图条目:map.entrySet().stream().sorted(Map.Entry.&lt;Integer, BigDecimal&gt;comparingByKey()).forEach(System.out::println); 或降序(从 1984-1980)map.entrySet().stream().sorted(Map.Entry.&lt;Integer, BigDecimal&gt;comparingByKey().reversed()).forEach(System.out::println);
  • 谢谢。还有一件事,我怎样才能使用地图穿越每个国家,而不是“AF”?
  • 查看最后一个请求的答案 ;)
  • 哈哈!抱歉,请阅读全文。 :) 谢谢芽。伟大的冠军!
【解决方案2】:

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

我建议您创建一个存储该数据的 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 只是为了说明这一点,但您应该使用自己的模型。

【讨论】:

  • 但是,您看到的这些数据实际上是从 API 接收的。我已经为将存储国家、年份和值的对象创建了一个类。
  • 那直接映射吧,不是吗?我的意思是,你会有类似的东西: List myData = receiveDataFromApi(); for(int i = 0; i
  • 非常感谢!
  • 没问题 :D 希望对您有所帮助^^
猜你喜欢
  • 2018-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-23
  • 1970-01-01
  • 2019-07-12
  • 1970-01-01
  • 2012-06-11
相关资源
最近更新 更多