Это решение немного сложнее, потому что критерии фильтрации состоят из нескольких частей, но это можно сделать, посчитав количество раз, когда был замечен индекс вопроса, самое большее, добавив только 2 решения на вопрос, и остановив один раз Index1
был замечен дважды.
Объектом фильтрации для этого критерия будет:
public class SolutionFilter implements Predicate<Solution> {
private final Map<String, Integer> counter = new HashMap<>();
@Override
public boolean test(Solution solution) {
Integer index1Count = counter.get("Index1");
if (index1Count != null && index1Count == 2) {
return false;
}
Integer count = counter.get(solution.getQuestion());
if (count == null) {
counter.put(solution.getQuestion(), 1);
return true;
}
else if (count == 1) {
counter.put(solution.getQuestion(), 2);
return true;
}
else {
return false;
}
}
}
Чтобы убедиться, что решения добавляются в обратном порядке, выполняется цикл, начиная с конца и продвигаясь к началу списка solutions
. Аналогично, чтобы гарантировать, что список вывода не в обратном порядке, используется Deque
, и соответствующие Solution
s добавляются к заголовку Deque
:
public static void main(final String[] args) {
List<Solution> solutions = Arrays.asList(
new Solution("Index1","a"),
new Solution("Index2","b"),
new Solution("Index3","c"),
new Solution("Index4","d"),
new Solution("Index5","ae"),
new Solution("Index1","afg"),
new Solution("Index2","adfg"),
new Solution("Index1","ag"),
new Solution("Index2","a"),
new Solution("Index3","a"),
new Solution("Index4","a"),
new Solution("Index5","a"),
new Solution("Index1","arrr"),
new Solution("Index2","a"),
new Solution("Index3","a")
);
SolutionFilter filter = new SolutionFilter();
Deque<Solution> filteredSolutions = new LinkedList<>();
for (int i = solutions.size() - 1; i > 0; i--) {
Solution solution = solutions.get(i);
if (filter.test(solution)) {
filteredSolutions.addFirst(solution);
}
}
System.out.println(filteredSolutions);
}
Это приводит к следующему выводу:
[{Index1: ag}, {Index2: a}, {Index3: a}, {Index4: a}, {Index5: a}, {Index1: arrr}, {Index2: a}, {Index3: a}]
Это может быть достигнуто с помощью Stream
, но это может быть более сложным.