Java扩展集合过滤

时间:2010-09-14 20:32:26

标签: java sorting collections filtering

我必须过滤并使用对象对ArrayList进行排序 - 每个对象都有 2 整数 => 每个对象4个英尺 - Column_1<的每个值Column_2
- Column_3<的每个值Column_4 即可。
......所以每对代表一段距离。

1.)第1(Column_1,Column_2)对和第2(Column_3,Column_4,)对中的距离必须相等。

2。)如果列表中存在Obj_1,其Column_2值等于Ob_1的Column_1值+ 1和

3。)如果列表中存在Obj_1,其Column_4值等于Ob__2的Column_3值+ 1

然后应该将这些对象合并到一个对象中,并尊重每对中的值。 ...(Column_1,Column_3)中的最小值和最大值(Column_2,Column_4)

示例:

Column_1  Column_2  Column_3  Column_4
过滤之前<----> ----------- --------------

1. 506       520     771       785
2. 106       110     210       214
3. 502       505     181       184
4. 714       717     270       273
5. 106       110     310       314
6. 111       115     215       219
7. 521       524     767       770
8. 502       505     350       353
9. 100       105     204       209    

-----------过滤后----------

1. 100        115    204       219
2. 106        110    310       314
3. 502        505    181       184
4. 714        717    270       273
5. 502        520    767       785

如何在Java中完成这种过滤?

2 个答案:

答案 0 :(得分:2)

我的第一个方法是

  1. 根据上述逻辑实现Comparable(或写一个Comparator),
  2. 编写实现相同逻辑的equals方法,
  3. ArrayList的内容填入TreeSet
  4. 迭代整个集合以在适用时合并相邻元素。
  5. TreeSet将按自然顺序(或使用提供的Comparator)对其元素进行排序。

    精炼方法

    不幸的是,我没有注意到不同的对象可能包含重叠的间隔,因此要合并的项目可能不相邻。对上述内容的改进可能是:

    1. 基于第1列和第3列实施Comparable
    2. (编写一个比较所有列的equals方法),
    3. ArrayList
    4. 的内容进行排序
    5. 对于列表中的每个元素,搜索满足上述条件2)和3)的元素,然后可以将它们合并到原始元素。由于列表是有序的,因此您可以在当前项目后使用子列表上的二进制搜索。如果当前元素与另一个元素合并,则更新第2列和第4列,但不更新1和3,因此排序不会更改。然后可以从列表中移除另一个元素,并使用列2和2的新值重复搜索。 4,删除元素后的子列表。

答案 1 :(得分:1)

Google collections为您提供了指定过滤谓词的选项,该谓词将对所有条目进行操作并决定保留哪个:

Collections2.filter(yourCollection, new Predicate<YourType>() {
    @Override
    public boolean apply(YourType param) {
    // return whether to retain or remove
    }
});