组按特定值列出数据

时间:2014-12-17 09:39:30

标签: java list

我有一个包含Billing IDEmail数据的列表。 可以在列表中复制结算ID和电子邮件。

这是我的列表数据:

List<Bill> billings = new ArrayList<Bill>();

        Bill bill1 = new Bill("90008489", "demo@gmail.com");
        Bill bill2 = new Bill("90008489", "oke@sample.com");
        Bill bill3 = new Bill("90008489", "welcom@gmail.com");
        Bill bill4 = new Bill("90008490", "hore@yahoo.com");
        Bill bill5 = new Bill("90008490", "fix.it@demo.co.id");
        Bill bill6 = new Bill("90008491", "yuhuuu@demo.co.id");

        billings.add(bill1);
        billings.add(bill2);
        billings.add(bill3);
        billings.add(bill4);
        billings.add(bill5);
        billings.add(bill6);

这是Bill的Java类:

public class Bill {
    private String id;
    private String email;
    private List<String> emails;

    public Bill(String id, String email) {
        super();
        this.id = id;
        this.email = email;
    }

    public Bill(String id, List<String> emails) {
        super();
        this.id = id;
        this.emails = emails;
    }

... Getter and Setter

我想按结算ID对该列表数据进行分组。 如果找到相同的结算ID,我想组合电子邮件数据。

我坚持要建造它。这是我的代码。

List<Bill> newBillings = new ArrayList<Bill>();
        for (int i = 0; i < (billings.size() - 1); i++) {

            List<String> emails = new ArrayList<String>();
            emails.add(billings.get(i).getEmail());

            //System.out.println(billings.get(i+1).getId());

            if (billings.get(i).getId() == billings.get(i + 1).getId()) {
                emails.add(billings.get(i+1).getEmail());


            }
        }

        for (Bill bill : newBillings) {
            System.out.println(bill.getId());
            for (String email : bill.getEmails()) {
                System.out.print(email  + ",");
            }

            System.out.println("\n-----");
        }

我的预期结果是:

90008489 - [demo@gmail.com, oke@sample.com, welcome@gmail.com]
90008490 - [hore@yahoo.com, fix.it@demo.co.id]
90008491 - [yuhuuu@demo.co.id]

3 个答案:

答案 0 :(得分:2)

我会说你使用了错误的数据结构。

我会完全重写它并使用Map<String, List<String>>因为你需要将每个id映射到邮件列表更合适。

Map<String, List<String>> map = new HashMap<>(); 
for(Bill b : billings) {
    List<String> list = map.get(b.getId()); //try to get the list with the specified id
    if(list == null) { //if the list is null, it means that there is no mapping yet in the map, so create one
        list = new ArrayList<>();
        map.put(b.getId(), list);
     }
     list.add(b.getEmail()); //add the corresponding email to the list
}

可以翻译成Java 8样式

Map<String, List<String>> map = billings.stream()
                    .collect(groupingBy(Bill::getId, mapping(Bill::getEmail, toList())));

答案 1 :(得分:0)

for (Bill currentBill:newBillings) {
  currentBill.setEmails(new ArrayList());
  for (Bill checkedBill:newBillings) {
    if (currentBill.getId() == checkedBill.getId() {
      currentBill.getEmails().add(checkedBill.getEmail();
    }
  }
}

答案 2 :(得分:0)

使用以billingId为键的Map,并将List作为值。

Map<Integer, List<Billing>> map = new Billing<>()

for(Billing bill : billings) {
   if(map.getKey() == billId) {
      if(map.getValue() == null) {
          map.setValue(new ArrayList());
      }
      map.getValue().add(bill));
   }

}

从头顶开始:)