Java扩展集合过滤

发布于 2024-09-19 00:34:15 字数 1294 浏览 7 评论 0原文

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

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

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

3.) 如果列表中存在 Obj_1 ,其 Column_4 值等于 Obj_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中如何实现这种过滤呢?

I have to filter and to sort a ArrayList wíth objects.
- Every object has 2 integer pairs => 4 ints per Object.
- Every value of Column_1 < Column_2 and
- Every value of Column_3 < Column_4.
... so each pair represents a distance.

1.) Distance in 1st(Column_1,Column_2) pair and 2nd(Column_3, Column_4,) pair have to be equal.

2.) if there exists in the list a Obj_1 , whose Column_2 value is equal to Column_1 value+1 of Obj_2 and

3.) if there exists in the list a Obj_1 , whose Column_4 value is equal to Column_3 value+1 of Obj_2

then this objects should be merged to one Object respecting values in each pair. ...minimal values in(Column_1,Column_3) and maximal values(Column_2,Column_4)

Example:

Column_1  Column_2  Column_3  Column_4

----------- before filtering --------------

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    

-----------after filtering----------

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

How can this kind of filtering be done in Java?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

情泪▽动烟 2024-09-26 00:34:15

我的第一个方法是

  1. 根据上述逻辑实现Comparable(或编写一个Comparator),
  2. 编写一个equals 方法实现相同的逻辑,
  3. 将 ArrayList 的内容填充到 TreeSet 中,
  4. 迭代该集合以在适用时合并相邻元素。

TreeSet 将按自然顺序(或使用提供的Comparator)对其元素进行排序。

精炼方法

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

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

My first approach would be to

  1. implement Comparable (or write a Comparator) based on the logic described above,
  2. write an equals method implementing the same logic,
  3. fill the contents of the ArrayList into a TreeSet,
  4. iterate over the set to merge adjacent elements when applicable.

The TreeSet will order its elements by natural ordering (or using a provided Comparator).

Refined approach

Unfortunately I failed to notice that distinct objects may contain overlapping intervals, thus items to be merged may not be adjacent. An improvement to the above could be:

  1. implement Comparable based on Columns 1 and 3,
  2. (write an equals method comparing all columns),
  3. sort the contents of the ArrayList,
  4. for each element in the list, search for elements fulfilling conditions 2) and 3) above, which can then be merged to the original element. Since the list is ordered, you can use binary search over the sublist after the current item. If the current element is merged with another, Columns 2 and 4 are updated, but 1 and 3 not, so the ordering does not change. The other element can then be removed from the list, and the search repeated with the new values of columns 2 & 4, for the sublist after the removed element.
清风疏影 2024-09-26 00:34:15

Google 集合让您可以选择指定将对所有条目进行操作的过滤谓词并决定保留哪些:

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

Google collections gives you the option to specify a filter predicate that will operate on all entries and decide which to preserve:

Collections2.filter(yourCollection, new Predicate<YourType>() {
    @Override
    public boolean apply(YourType param) {
    // return whether to retain or remove
    }
});
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文