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