我有一个包含Billing ID
和Email
数据的列表。
可以在列表中复制结算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]
答案 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));
}
}
从头顶开始:)