/* * Copyright 2014 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.dashbuilder.dataset.engine.index; import java.util.AbstractList; import java.util.List; import java.util.ArrayList; /** * A read-only list implementation that aggregates a set of sub lists. */ public class AggregatedList<T> extends AbstractList<T> { protected List<Integer> subIndexes = new ArrayList<Integer>(); protected List<List<T>> subLists = new ArrayList<List<T>>(); public AggregatedList() { super(); } protected int lastIndex() { if (subIndexes.isEmpty()) return 0; return subIndexes.get(subIndexes.size()-1); } public void addSubList(List<T> l) { subIndexes.add(lastIndex() + l.size()); subLists.add(l); } @Override public int size() { return lastIndex(); } @Override /** * <pre> * * | sub-index | elements * ----------------------------------------- * Sublist 1 | 3 | A B C * Sublist 2 | 7 | D E F G * Sublist 3 | 10 | H I J * * Element: |A|B|C| D|E|F|G| H|I|J| * Real idx: |0|1|2| 3|4|5|6| 7|8|9| * Local idx: |0|1|2| 0|1|2|3| 0|1|2| * </pre> */ public T get(int index) { for (int i=0; i< subIndexes.size(); i++) { Integer relIndex = subIndexes.get(i); if (index < relIndex) { List<T> subList = subLists.get(i); int realIndex = index - (relIndex - subList.size()); return (T) subList.get(realIndex); } } throw new IndexOutOfBoundsException("The last index allowed is: " + lastIndex()); } }