00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 package de.picana.clusterer;
00014
00015 import java.util.*;
00016
00017
00024 public class IndexList {
00025
00026 private List orig_list;
00027 private ArrayList[] ref_list;
00028 private ArrayList[] iter_list;
00029 private int dim;
00030 private int size;
00031 private int[] index_first;
00032 private int[] index_last;
00033
00034
00035 public class Node {
00036 public int index;
00037 public int previous;
00038 public int next;
00039
00040 public Node(int index, int previous, int next) {
00041 this.index = index;
00042 this.previous = previous;
00043 this.next = next;
00044 }
00045 }
00046
00047
00048 class IndexComparator implements Comparator {
00049
00050 private int component;
00051
00052 public IndexComparator(int component) {
00053 this.component = component;
00054 }
00055
00056 public int compare(Object o1, Object o2) {
00057 Node n1 = (Node)o1;
00058 Node n2 = (Node)o2;
00059 MLVector vec1 = (MLVector)orig_list.get(n1.index);
00060 MLVector vec2 = (MLVector)orig_list.get(n2.index);
00061 if (vec1.value[component] > vec2.value[component])
00062 return 1;
00063 if (vec1.value[component] < vec2.value[component])
00064 return -1;
00065 return 0;
00066 }
00067 }
00068
00069
00071 public IndexList(List list) {
00072 orig_list = list;
00073 MLVector vec = (MLVector)orig_list.get(0);
00074 size = orig_list.size();
00075 dim = vec.dim;
00076
00077 ref_list = new ArrayList[dim];
00078 iter_list = new ArrayList[dim];
00079 index_first = new int[dim];
00080 index_last = new int[dim];
00081
00082 Node n;
00083 int i, j;
00084
00085 for (i=0; i < dim; i++) {
00086
00087 ref_list[i] = new ArrayList();
00088 iter_list[i] = new ArrayList();
00089
00090 for (j=0; j < size; j++)
00091 ref_list[i].add(new Node(j, -1, -1));
00092
00093 Collections.sort(ref_list[i], new IndexComparator(i));
00094
00095 for (j=0; j < size; j++) {
00096 n = (Node)ref_list[i].get(j);
00097 n.previous = j-1;
00098 n.next = (j < size-1) ? j+1 : -1;
00099 }
00100
00101 index_first[i] = 0;
00102 index_last[i] = size-1;
00103 }
00104 }
00105
00106 public int getFirst(int component) {
00107 Node n = (Node)ref_list[component].get(index_first[component]);
00108 return n.index;
00109 }
00110
00111 public int getLast(int component) {
00112 Node n = (Node)ref_list[component].get(index_last[component]);
00113 return n.index;
00114 }
00115
00116 public IndexListIterator iterator(int component) {
00117 IndexListIterator iter = new IndexListIterator(
00118 ref_list[component], iter_list[component],
00119 index_first, index_last, -1, component, false);
00120 iter_list[component].add(iter);
00121 return iter;
00122 }
00123
00124 public IndexListIterator iteratorReverse(int component) {
00125 IndexListIterator iter = new IndexListIterator(
00126 ref_list[component], iter_list[component],
00127 index_first, index_last, -1, component, true);
00128 iter_list[component].add(iter);
00129 return iter;
00130 }
00131
00132 public void freeIterator(int component, IndexListIterator iter) {
00133 iter_list[component].remove(iter);
00134 }
00135 }