1 /*****************************************************/
\r
2 /* This java file is a part of the */
\r
4 /* - Plouf's Java IRC Client - */
\r
6 /* Copyright (C) 2002 - 2004 Philippe Detournay */
\r
8 /* All contacts : theplouf@yahoo.com */
\r
10 /* PJIRC is free software; you can redistribute */
\r
11 /* it and/or modify it under the terms of the GNU */
\r
12 /* General Public License as published by the */
\r
13 /* Free Software Foundation; version 2 or later of */
\r
16 /* PJIRC is distributed in the hope that it will */
\r
17 /* be useful, but WITHOUT ANY WARRANTY; without */
\r
18 /* even the implied warranty of MERCHANTABILITY or */
\r
19 /* FITNESS FOR A PARTICULAR PURPOSE. See the GNU */
\r
20 /* General Public License for more details. */
\r
22 /* You should have received a copy of the GNU */
\r
23 /* General Public License along with PJIRC; if */
\r
24 /* not, write to the Free Software Foundation, */
\r
25 /* Inc., 59 Temple Place, Suite 330, Boston, */
\r
26 /* MA 02111-1307 USA */
\r
28 /*****************************************************/
\r
32 import java.util.Enumeration;
\r
33 import java.util.Vector;
\r
37 // //private Hashtable t;
\r
41 // public GroupItem(Object o)
\r
43 // //t=new Hashtable();
\r
50 // public void add(Object o)
\r
57 // t=new Object[] {o};
\r
62 // throw new RuntimeException("Didn't expect similar keys!!");
\r
67 // public void remove(Object o)
\r
73 // public int size()
\r
75 // //return t.size();
\r
76 // if(s==null) return 0;
\r
77 // //if(t==null) return 1;
\r
79 // //return t.length+1;
\r
82 // public Object getFirstItem()
\r
84 // //return t.elements().nextElement();
\r
88 // //public Enumeration elements()
\r
90 // //return t.elements();
\r
101 public TreeNode left;
\r
105 public TreeNode right;
\r
106 // public GroupItem item;
\r
107 // public Object objects[];
\r
109 * Objects in this node.
\r
111 public Vector objects;
\r
112 // private int count;
\r
113 private Comparator _comparator;
\r
116 * Create a new TreeNode
\r
120 * @param comparator
\r
123 public TreeNode(Object itm, Comparator comparator) {
\r
124 _comparator = comparator;
\r
126 objects = new Vector(1, 0);
\r
127 objects.insertElementAt(itm, objects.size());
\r
129 left = new TreeNode(comparator);
\r
130 right = new TreeNode(comparator);
\r
134 * Create a new TreeNode
\r
136 * @param comparator
\r
139 public TreeNode(Comparator comparator) {
\r
140 _comparator = comparator;
\r
142 objects = new Vector(1, 0);
\r
149 * Returns true if node is external.
\r
151 * @return true if node is external, false otherwise.
\r
153 public boolean external() {
\r
154 return ((left == null) || (right == null));
\r
158 * Remove the given item.
\r
162 * @return resulting tree node.
\r
163 * @throws Exception
\r
165 public TreeNode remove(Object itm) throws Exception {
\r
167 throw new Exception();
\r
169 int compare = _comparator.compare(itm,/* item.getFirstItem() */
\r
170 objects.elementAt(0));
\r
171 if (compare == 0) {
\r
172 // item.remove(itm);
\r
173 objects.removeElement(itm);
\r
175 if (objects.size() == 0) {
\r
176 if (left.external())
\r
178 if (right.external())
\r
180 return right.addTree(left);
\r
183 } else if (compare < 0) {
\r
184 left = left.remove(itm);
\r
187 right = right.remove(itm);
\r
192 private TreeNode addTree(TreeNode tree) throws Exception {
\r
195 if (tree.external())
\r
198 int compare = _comparator.compare(tree.objects.elementAt(0), objects.elementAt(0));
\r
199 if (compare == 0) {
\r
200 throw new Exception();
\r
201 } else if (compare < 0) {
\r
202 left = left.addTree(tree);
\r
205 right = right.addTree(tree);
\r
215 * @return resulting tree node.
\r
216 * @throws Exception
\r
218 public TreeNode add(Object itm) throws Exception {
\r
220 return new TreeNode(itm, _comparator);
\r
223 int compare = _comparator.compare(itm, objects.elementAt(0));
\r
224 if (compare == 0) {
\r
226 objects.insertElementAt(itm, objects.size());
\r
227 // throw new RuntimeException("Duplicate key");
\r
229 } else if (compare < 0) {
\r
230 left = left.add(itm);
\r
233 right = right.add(itm);
\r
239 * Start an inorder tree traversal.
\r
242 * traversal listener.
\r
246 public void inorder(TreeTraversalListener lis, Object param) {
\r
249 left.inorder(lis, param);
\r
250 // Enumeration e=item.elements();
\r
251 // while(e.hasMoreElements()) lis.nextItem(e.nextElement(),param);
\r
252 // lis.nextItem(object,param);
\r
253 for (int i = 0; i < objects.size(); i++)
\r
254 lis.nextItem(objects.elementAt(i), param);
\r
255 right.inorder(lis, param);
\r
262 public class SortedList implements TreeTraversalListener {
\r
263 private TreeNode _root;
\r
264 private Vector _items;
\r
265 private Comparator _comparator;
\r
266 private boolean _upToDate;
\r
269 * Create a new SortedList, using the given Comparator for the order
\r
272 * @param comparator
\r
273 * comparator to be used for ordering.
\r
275 public SortedList(Comparator comparator) {
\r
276 _comparator = comparator;
\r
277 _root = new TreeNode(_comparator);
\r
278 _items = new Vector();
\r
283 * Get the amount of items in the list.
\r
285 * @return list size.
\r
287 public int getSize() {
\r
290 return _items.size();
\r
294 * Add an item in the list.
\r
299 public void add(Object item) {
\r
301 _root = _root.add(item);
\r
302 } catch (Exception e) {
\r
308 * Remove the given item from the list.
\r
311 * item to remove from the list.
\r
313 public void remove(Object item) {
\r
315 _root = _root.remove(item);
\r
316 } catch (Exception e) {
\r
322 public void begin(Object param) {
\r
323 _items = new Vector();
\r
327 public void nextItem(Object item, Object param) {
\r
328 _items.insertElementAt(item, _items.size());
\r
332 public void end(Object param) {
\r
336 private void computeVector() {
\r
337 getItems(this, null);
\r
341 * Get a sorted enumeration of items.
\r
343 * @return a sorted enumeration of items in the list.
\r
345 public Enumeration getItems() {
\r
348 return _items.elements();
\r
352 * Get the i'th element in the list. Index are ordered.
\r
356 * @return object at i'th position.
\r
358 public Object getItemAt(int i) {
\r
361 return _items.elementAt(i);
\r
365 * Begin a new traversal.
\r
368 * traversal listener.
\r
372 public void getItems(TreeTraversalListener lis, Object param) {
\r
374 _root.inorder(lis, param);
\r
381 public void clear() {
\r
382 _root = new TreeNode(_comparator);
\r
383 _items = new Vector();
\r