-5

我在这里有一个列表:

List<String> container = new ArrayList<String>();
container.add("Book");
container.add("Paper");
container.add("Book");
container.add("Pen");
container.add("Pen");
container.add("Book");

如何将此列表中的数据分类为 3 个子列表,如下所示:

List <String> container1  ==>that still keep 3 elements which have the same name "Book"
List <String> container2  ==>that have 1 element which is "Paper"
List <String> container3  ==>that still keep 2 elements which have the same name "Pen"

谢谢您的帮助

如果有很多评论我的问题不清楚,所以我会这样问

如果我的列表包含比上面的示例列表更多的重复元素,则子容器列表(如 container1、container2...、containerN)将取决于重复元素的数量

我怎样才能做到这一点?

4

2 回答 2

3

这是一个通用的工作实现,它将为任意数量的重复元素以及正确覆盖hashCodeequals(例如,整数、字符串、双精度)的任何类型的集合执行您想要的操作:

public <T> Collection<List<T>> classify(Collection<T> container) {
    Map<T, List<T>> lists = new HashMap<>();
    for (T element : container) {
        List<T> elementList = lists.get(element);
        if (elementList == null) {
            elementList = new ArrayList<>();
            lists.put(element, elementList);
        }
        elementList.add(element);
    } 
    return lists.values();
 }

示例用法:

Collection<List<String>> lists = classify(container);
System.out.println(lists);
于 2013-05-11T23:57:20.847 回答
3

如果您不介意冗长,那么您可以使用 Google Guava 的FluentIterable. 这将允许您在给定特定的情况Predicate下过滤集合。

List<String> words = Lists
        .newArrayList("Book", "Paper", "Book", "Pen", "Paper", "Book");

FluentIterable<String> bookFiltered = FluentIterable
        .from(words)
        .filter(new Predicate<String>() {
    @Override
    public boolean apply(final String input) {
        return "Book".equals(input);
    }
});

FluentIterable<String> paperFiltered = FluentIterable
        .from(words)
        .filter(new Predicate<String>() {
    @Override
    public boolean apply(final String input) {
        return "Paper".equals(input);
    }
});

FluentIterable<String> penFiltered = FluentIterable
        .from(words)
        .filter(new Predicate<String>() {
    @Override
    public boolean apply(final String input) {
        return "Pen".equals(input);
    }
});

System.out.println(bookFiltered); // [Book, Book, Book]
System.out.println(paperFiltered); // [Paper, Paper]
System.out.println(penFiltered); // [Pen]
于 2013-05-11T23:16:56.503 回答