/******************************************************************************* * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Marc R. Hoffmann - initial API and implementation * *******************************************************************************/ package org.jacoco.report.internal.html.table; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; /** * A index on a list of items sorted with a given {@link Comparator}. The index * does not change the list itself. * * @param * type of the items */ final class SortIndex { private final Comparator comparator; private class Entry implements Comparable { final int idx; final T item; Entry(final int idx, final T item) { this.idx = idx; this.item = item; } public int compareTo(final Entry o) { return comparator.compare(item, o.item); } } private final List list = new ArrayList(); private int[] positions; /** * Creates a new index based in the given comparator. * * @param comparator * comparator to sort items */ public SortIndex(final Comparator comparator) { this.comparator = comparator; } /** * Initializes the index for the given list of items. * * @param items * list of items */ public void init(final List items) { this.list.clear(); int idx = 0; for (final T i : items) { final Entry entry = new Entry(idx++, i); this.list.add(entry); } Collections.sort(list); if (positions == null || positions.length < items.size()) { positions = new int[items.size()]; } int pos = 0; for (final Entry e : this.list) { positions[e.idx] = pos++; } } /** * Returns the sorted position of the element with the given index in the * items list provided to the init() method. * * @param idx * index of a element of the list * @return its position in a sorted list */ public int getPosition(final int idx) { return positions[idx]; } }