SortIndex.java revision d05ad7d4bc65e91b6c6efb45687f7a850d07f02a
1/*******************************************************************************
2 * Copyright (c) 2009, 2011 Mountainminds GmbH & Co. KG and Contributors
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
7 *
8 * Contributors:
9 *    Marc R. Hoffmann - initial API and implementation
10 *
11 *******************************************************************************/
12package org.jacoco.report.internal.html.table;
13
14import java.util.ArrayList;
15import java.util.Collections;
16import java.util.Comparator;
17import java.util.List;
18
19/**
20 * A index on a list of items sorted with a given {@link Comparator}. The index
21 * does not change the list itself.
22 *
23 * @author Marc R. Hoffmann
24 * @version $qualified.bundle.version$
25 * @param <T>
26 *            type of the items
27 */
28final class SortIndex<T> {
29
30	private final Comparator<? super T> comparator;
31
32	private class Entry implements Comparable<Entry> {
33
34		final int idx;
35
36		final T item;
37
38		Entry(final int idx, final T item) {
39			this.idx = idx;
40			this.item = item;
41		}
42
43		public int compareTo(final Entry o) {
44			return comparator.compare(item, o.item);
45		}
46
47	}
48
49	private final List<Entry> list = new ArrayList<Entry>();
50
51	private int[] positions;
52
53	/**
54	 * Creates a new index based in the given comparator.
55	 *
56	 * @param comparator
57	 *            comparator to sort items
58	 */
59	public SortIndex(final Comparator<? super T> comparator) {
60		this.comparator = comparator;
61	}
62
63	/**
64	 * Initializes the index for the given list of items.
65	 *
66	 * @param items
67	 *            list of items
68	 */
69	public void init(final List<? extends T> items) {
70		this.list.clear();
71		int idx = 0;
72		for (final T i : items) {
73			final Entry entry = new Entry(idx++, i);
74			this.list.add(entry);
75		}
76		Collections.sort(list);
77		if (positions == null || positions.length < items.size()) {
78			positions = new int[items.size()];
79		}
80		int pos = 0;
81		for (final Entry e : this.list) {
82			positions[e.idx] = pos++;
83		}
84	}
85
86	/**
87	 * Returns the sorted position of the element with the given index in the
88	 * items list provided to the {@link #init(List)} method.
89	 *
90	 * @param idx
91	 *            index of a element of the list
92	 * @return its position in a sorted list
93	 */
94	public int getPosition(final int idx) {
95		return positions[idx];
96	}
97
98}
99