如何在ArrayList <customobject> </customobject>中对元素进行分组

时间:2014-02-24 13:20:06

标签: java arrays collections arraylist grouping

是否有一种简单快捷的方法可以在Java中对ArrayList中的元素进行分组? 我问是否已经有一种方法没有实现我的自我?

之类的东西
Collections.sort(monuments,new objectComparator());

修改  我有一个对象列表,其中有一个名为category的字段,此列表将显示给用户。我希望首先显示category_type == 1的对象,依此类推。

我无法通过比较器实现这一点,因为比较器的工作方式如下:

如果第一个值更大,则返回int a&gt; 0 return int a

2 个答案:

答案 0 :(得分:3)

实际上这可以用比较器来实现:

public int compareTo(Monument o) {
    Integer otherCategory = o.getCategoryType();
    Integer thisCategory = this.getCategoryType();
    return thisCategory.compareTo(otherCategory);
}

如果比较器相同则返回0,如果thisCategory小于otherCategory则返回-1,如果thisCategory大于otherCategory则返回1

这是基于这个想法的单元测试:

public class SortTest {

    @Test
    public void test() {
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(1);

        System.out.println("Unsorted: " + list);

        Collections.sort(list);

        System.out.println("Sorted: " + list);
    }

}

输出:

Unsorted: [1, 2, 3, 4, 1]
Sorted: [1, 1, 2, 3, 4]

答案 1 :(得分:1)

尝试使用Map<X, List<CustomObject>>进行分组,其中X是分组(在您的情况下是表示category_type的整数)

例如:

public Map<Integer, List<CustomObject>> groupByCategoryType(List<CustomObject> list) {
    Map<Integer, List<CustomObject>> map = new TreeMap<Integer, List<CustomObject>>();
    for (CustomObject o : list) {
        List<CustomObject> group = map.get(o.getCategoryType());
        if (group == null) {
           group = new ArrayList();
           map.put(o.getCategoryType(), group);
        }
        group.add(o);
    }
    return map;
}