2014-12-17 6 views
0

У меня есть список, который содержит Billing ID и Email данных. Идентификатор фактуры и электронная почта могут быть дублированы в списке.Список данных группы по конкретному значению

Вот мой список данных:

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

     Bill bill1 = new Bill("90008489", "[email protected]"); 
     Bill bill2 = new Bill("90008489", "[email protected]"); 
     Bill bill3 = new Bill("90008489", "[email protected]"); 
     Bill bill4 = new Bill("90008490", "[email protected]"); 
     Bill bill5 = new Bill("90008490", "[email protected]"); 
     Bill bill6 = new Bill("90008491", "[email protected]"); 

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

Вот мой 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 

Я хочу группирования, что данные списка по Billing 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 - [[email protected], [email protected], [email protected]] 
90008490 - [[email protected], [email protected]] 
90008491 - [[email protected]] 

ответ

2

Я хотел бы сказать, что вы используете неправильную структуру данных для этого.

Я бы полностью переписал его и использовал Map<String, List<String>>, так как это было бы более уместно, так как вам нужно было сопоставить каждый идентификатор с списком писем.

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()))); 
+0

Ничего себе. Он работает, спасибо вам большое. Я очень смутился. Как подготовить логику цикла? :( – fanjavaid

+0

@fanjavaid Когда вы говорите в своей голове «group by», вы должны подумать об использовании Карты. Тогда вам нужно подумать, чтобы увидеть, как вы будете группировать свои элементы, тогда это просто вопрос чтения doc, чтобы просмотреть доступные методы. Просто попробуйте тренироваться, и в будущем это станет проще и проще. –

+0

@fanjavaid О, также вы не должны сравнивать значения String с помощью '=='. Вместо этого используйте 'equals()'. –

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

Вы не забыли? –

0

Используйте карту, где BILLINGID является ключ и иметь список в качестве значения.

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)); 
    } 

} 

Из верхней части моей головы :)

Смежные вопросы