View Javadoc

1   /*
2    * Copyright (c) 1998-2002 The Jgroup Team.
3    *
4    * This program is free software; you can redistribute it and/or modify
5    * it under the terms of the GNU Lesser General Public License version 2 as
6    * published by the Free Software Foundation.
7    *
8    * This program is distributed in the hope that it will be useful,
9    * but WITHOUT ANY WARRANTY; without even the implied warranty of
10   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11   * GNU Lesser General Public License for more details.
12   *
13   * You should have received a copy of the GNU Lesser General Public License
14   * along with this program; if not, write to the Free Software
15   * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
16   *
17   */
18  
19  package jgroup.util;
20  
21  /**
22   *  The <code>OrderedList</code> class represents an ordered collection
23   *  of objects.  The order of elements is based on their keys,
24   *  represented as integer values.
25   *
26   *  @see jgroup.relacs.registry.BindingList
27   *  @author Alberto Montresor
28   *  @since Jgroup 1.0
29   */
30  public class OrderedList {
31  
32    ////////////////////////////////////////////////////////////////////////////////////////////
33    // Fields
34    ////////////////////////////////////////////////////////////////////////////////////////////
35  
36    /** The identifier of this element */
37    public int            key;
38  
39    /** Reference to the next element */
40    protected OrderedList next;
41  
42    ////////////////////////////////////////////////////////////////////////////////////////////
43    // Constructors
44    ////////////////////////////////////////////////////////////////////////////////////////////
45  
46    /**
47     * Creates an empty list.
48     */
49    protected OrderedList()
50    {
51      next = null;
52    }
53  
54    ////////////////////////////////////////////////////////////////////////////////////////////
55    // Methods
56    ////////////////////////////////////////////////////////////////////////////////////////////
57  
58    /**
59     *  Inserts the specified element in the OrderedList.  If the object's
60     *  key is already present in the OrderedList, the element is not
61     *  inserted.
62     *
63     *  @param object
64     *    The element to be inserted in this OrderedList.
65     *  @return 
66     *    True if the object has previously been inserted; false otherwise.
67     */
68    public boolean insert(OrderedList object)
69    {
70      OrderedList                s;              // Used to scan list
71  
72      for (s = this; s.next != null && s.next.key < object.key; s = s.next);
73      if (s.next == null || s.next.key > object.key) {
74        object.next = s.next;
75        s.next = object;
76        return true;
77      }
78      return false;
79    }
80  
81    /**
82     * Removes the first occurrence of an  element with the specified key in this OrderedList.
83     * If the OrderedList does not contain the element, it is unchanged and the methods returns
84     * <code> null</code>.
85     *
86     * @param key         the key to search for.
87     */
88    public OrderedList remove(int key)
89    {
90      OrderedList                s;              // Used to scan list
91      OrderedList                ret;            // Return value
92  
93      for (s = this; s.next != null && s.next.key < key; s = s.next);
94      ret = null;
95      if (s.next != null && s.next.key == key) {
96        ret = s.next;
97        s.next = s.next.next;
98      }
99  
100     return ret;
101   }
102 
103   /**
104    *
105    * @param key         the key to search for.
106    */
107   public void removeAll(int key)
108   {
109     OrderedList s;
110     for (s = this; s.next != null && s.next.key <= key; s = s.next);
111     this.next = s.next;
112   }
113 
114   /**
115    *  Removes and returns the first element of the list.  If the list is
116    *  empty, <code>null</code> will be returned.
117    */
118   public OrderedList removeFirst()
119   {
120     OrderedList ret = this.next;
121     if (this.next != null)
122       this.next = this.next.next;
123     return ret;
124   }
125 
126   /**
127    * Returns the first occurrence in this OrderedList of a element with the specified
128    * key, or <code> null</code> if the element is not found.
129    *
130    * @param key         the key to search for.
131    */
132   public OrderedList lookup(int key)
133   {
134     OrderedList                s;              // Used to scan list
135 
136     for (s = this.next; s != null && s.key < key; s = s.next);
137     return ((s != null && s.key == key) ? s : null);
138   }
139 
140   /**
141    * Returns the next element in the OrderedList.
142    */
143   public OrderedList getNext()
144   {
145     return next;
146   }
147 
148   /**
149    * Returns the first element of the OrderedList
150    */
151   public OrderedList getFirst()
152   {
153     return next;
154   }
155 
156   /**
157    * Returns true if this OrderedList contains no elements.
158    */
159   public boolean isEmpty()
160   {
161     return (next == null);
162   }
163 
164   /**
165    * Count the number of elements in the list
166    */
167   public int count()
168   {
169     int count = 0;
170     OrderedList scan = next;
171     while (scan != null) {
172       count++;
173       scan = scan.next;
174     }
175     return count;
176   }
177 
178 
179 } // END OrderedList