2015-07-13 4 views
1

К сожалению, я нахожусь на Java 7, поэтому я не могу использовать возможности Java 8.Как я могу разбить список на подсписок

У меня есть следующие перечисления:

public enum Type 
{ 
    MAILING, 
    RESEPT, 
    CURRENT, 
    //... 
    USER 
} 

и контейнер класса этого типа:

public class Container 
{ 
    public Type getType() 
    { 
     // Impl 
    } 
} 

Теперь у меня есть некоторые List<Container>. Как я могу разбить его на List<List<Container>> так, чтобы любой List<Container> в List<List<Container>> содержит только Container s с тем же getType().

ответ

2

Вот несколько отличается Java 7 подход:

List<Container> containers = new ArrayList<>(); 

containers.add(/* ... */); 
containers.add(/* ... */); 
containers.add(/* ... */); 
containers.add(/* ... */); 
containers.add(/* ... */); 
containers.add(/* ... */); 

Map<Type, List<Container>> split = new HashMap<>(); 

for (Container container : containers) { 
    if (!split.containsKey(container.getType())) { 
     split.put(container.getType(), new ArrayList<Container>()); 
    } 
    split.get(container.getType()).add(container); 
} 

List<List<Container>> listOfLists = new ArrayList<>(split.values()); 
+0

Да, на самом деле ясный подход. Спасибо. –

+2

Одна заметка: Карта не содержит метода contains. Вероятно, вы имели в виду containsKey(). –

+0

Спасибо, Обновлено. Я действительно не проверял это :-) –

3

Если у вас есть Java 8, вы можете использовать Stream -API's Collectors.groupingBy(...). Затем вы получите возвращаемый Map<Type, List<Container>>. Затем вы можете просто перебрать значения карты и поместить ее в список.

+0

Я прошу прощения за не указав эту важную информацию. Я все еще в Java 7 –

+0

Есть ли какой-то Java <8 способ решить эту проблему? Возможно, с Common или guava. –

2

В случае Java 7, я бы порекомендовал цикл через перечисления values().

List<Container> completeList = new ArrayList<>(); 

List<List<Container>> splitList = new ArrayList<>(); 

for (Type type : Type.values()) { 
    List<Container> containerTypeList = new ArrayList<>(); 
    for (Container c : completeList) { 
     if (c.getType().equals(type)) { 
      containerTypeList.add(c); 
     } 
    } 

    splitList.add(containerTypeList); 
} 
Смежные вопросы