Java расширенная фильтрация коллекций - PullRequest
1 голос
/ 15 сентября 2010

Мне нужно отфильтровать и отсортировать ArrayList с объектами.
- Каждый объект имеет 2 целое число пары => 4 дюйма на каждый объект .
- каждое значение Column_1 и
- каждое значение Column_3 .
... поэтому каждая пара представляет расстояние.

1.) Расстояние в 1-й (Column_1, Column_2) и 2-й (Column_3, Column_4,) парах должно быть одинаковым.

2.) Если в списке существует объект Obj_1, значение Column_2 которого равно значению Column_1 + 1 для Obj_2 и

3.), Если в списке существует объект Obj_1, чейЗначение Column_4 равно значению Column_3 + 1 из Obj_2

, тогда эти объекты должны быть объединены в один объект с соответствующими значениями в каждой паре.... минимальные значения в (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 ]

2 голосов
/ 15 сентября 2010

Мой первый подход был бы к

  1. реализовать Comparable (или написать Comparator) на основе логики, описанной выше,
  2. написать метод equals, реализующий ту же логику,
  3. заполнить содержимое ArrayList в TreeSet,
  4. перебор набора для объединения смежных элементов, когда это применимо.

TreeSet упорядочит свои элементы путем естественного упорядочения (или с использованием предоставленного Comparator).

Изысканный подход

К сожалению, я не заметил, что отдельные объекты могут содержать перекрывающиеся интервалы, поэтому объединяемые элементы могут не быть смежными. Улучшение вышеупомянутого может быть:

  1. агрегат Comparable на основе столбцов 1 и 3,
  2. (напишите метод equals, сравнивающий все столбцы),
  3. сортировать содержимое ArrayList,
  4. для каждого элемента в списке найдите элементы, удовлетворяющие условиям 2) и 3) выше, которые затем можно объединить с исходным элементом. Поскольку список упорядочен, вы можете использовать бинарный поиск по подсписку после текущего элемента. Если текущий элемент объединен с другим, столбцы 2 и 4 обновляются, а 1 и 3 нет, поэтому порядок не изменяется. Затем можно удалить другой элемент из списка и повторить поиск с новыми значениями столбцов 2 и 4 для подсписка после удаленного элемента.
1 голос
/ 15 сентября 2010

Google collection дает вам возможность указать предикат фильтра, который будет работать со всеми записями и решить, какой из них сохранить:

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