001 /*----------------------------------------------------------------------------*/
002 /* Copyright (c) FIRST 2008-2012. All Rights Reserved. */
003 /* Open Source Software - may be modified and shared by FRC teams. The code */
004 /* must be accompanied by the FIRST BSD license file in the root directory of */
005 /* the project. */
006 /*----------------------------------------------------------------------------*/
007 package edu.wpi.first.wpilibj.util;
008
009 import java.util.Vector;
010
011 /**
012 *
013 * @author dtjones
014 */
015 public class SortedVector extends Vector {
016
017 /**
018 * Interface used to determine the order to place sorted objects.
019 */
020 public static interface Comparator {
021
022 /**
023 * Compare the given two objects.
024 * @param object1 First object to compare
025 * @param object2 Second object to compare
026 * @return -1, 0, or 1 if the first object is less than, equal to, or
027 * greater than the second, respectively
028 */
029 public int compare(Object object1, Object object2);
030 }
031 Comparator comparator;
032
033 /**
034 * Create a new sorted vector and use the given comparator to determine order.
035 * @param comparator The comparator to use to determine what order to place
036 * the elements in this vector.
037 */
038 public SortedVector(Comparator comparator) {
039 this.comparator = comparator;
040 }
041
042 /**
043 * Adds an element in the Vector, sorted from greatest to least.
044 * @param element The element to add to the Vector
045 */
046 public void addElement(Object element) {
047 int highBound = size();
048 int lowBound = 0;
049 while (highBound - lowBound > 0) {
050 int index = (highBound + lowBound) / 2;
051 int result = comparator.compare(element, elementAt(index));
052 if (result < 0) {
053 lowBound = index + 1;
054 } else if (result > 0) {
055 highBound = index;
056 } else {
057 lowBound = index;
058 highBound = index;
059 }
060 }
061 insertElementAt(element, lowBound);
062 }
063
064 /**
065 * Sort the vector.
066 */
067 public void sort() {
068 Object[] array = new Object[size()];
069 copyInto(array);
070 removeAllElements();
071 for (int i = 0; i < array.length; i++) {
072 addElement(array[i]);
073 }
074 }
075 }