001 /* ===========================================================
002 * JFreeChart : a free chart library for the Java(tm) platform
003 * ===========================================================
004 *
005 * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors.
006 *
007 * Project Info: http://www.jfree.org/jfreechart/index.html
008 *
009 * This library is free software; you can redistribute it and/or modify it
010 * under the terms of the GNU Lesser General Public License as published by
011 * the Free Software Foundation; either version 2.1 of the License, or
012 * (at your option) any later version.
013 *
014 * This library is distributed in the hope that it will be useful, but
015 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
016 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
017 * License for more details.
018 *
019 * You should have received a copy of the GNU Lesser General Public
020 * License along with this library; if not, write to the Free Software
021 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
022 * USA.
023 *
024 * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
025 * in the United States and other countries.]
026 *
027 * -----------------
028 * KeyedObjects.java
029 * -----------------
030 * (C) Copyright 2003-2005, by Object Refinery Limited.
031 *
032 * Original Author: David Gilbert (for Object Refinery Limited);
033 * Contributor(s): -;
034 *
035 * $Id: KeyedObjects.java,v 1.5.2.1 2005/10/25 21:29:13 mungady Exp $
036 *
037 * Changes:
038 * --------
039 * 31-Oct-2002 : Version 1 (DG);
040 * 11-Jan-2005 : Minor tidy up (DG);
041 *
042 */
043
044 package org.jfree.data;
045
046 import java.io.Serializable;
047 import java.util.Iterator;
048 import java.util.List;
049
050 import org.jfree.util.PublicCloneable;
051
052 /**
053 * A collection of (key, object) pairs.
054 */
055 public class KeyedObjects implements Cloneable, PublicCloneable, Serializable {
056
057 /** For serialization. */
058 private static final long serialVersionUID = 1321582394193530984L;
059
060 /** Storage for the data. */
061 private List data;
062
063 /**
064 * Creates a new collection (initially empty).
065 */
066 public KeyedObjects() {
067 this.data = new java.util.ArrayList();
068 }
069
070 /**
071 * Returns the number of items (values) in the collection.
072 *
073 * @return The item count.
074 */
075 public int getItemCount() {
076 return this.data.size();
077 }
078
079 /**
080 * Returns an object.
081 *
082 * @param item the item index (zero-based).
083 *
084 * @return The object (<code>null</code> if the index is out of range).
085 */
086 public Object getObject(int item) {
087 Object result = null;
088 if (item >= 0 && item < this.data.size()) {
089 KeyedObject kobj = (KeyedObject) this.data.get(item);
090 if (kobj != null) {
091 result = kobj.getObject();
092 }
093 }
094 return result;
095 }
096
097 /**
098 * Returns a key.
099 *
100 * @param index the item index (zero-based).
101 *
102 * @return The row key.
103 *
104 * @throws IndexOutOfBoundsException if <code>index</code> is out of bounds.
105 */
106 public Comparable getKey(int index) {
107 Comparable result = null;
108 if (index >= 0 && index < this.data.size()) {
109 KeyedObject item = (KeyedObject) this.data.get(index);
110 if (item != null) {
111 result = item.getKey();
112 }
113 }
114 return result;
115 }
116
117 /**
118 * Returns the index for a given key.
119 *
120 * @param key the key.
121 *
122 * @return The index, or <code>-1</code> if the key is unrecognised.
123 */
124 public int getIndex(Comparable key) {
125 int result = -1;
126 int i = 0;
127 Iterator iterator = this.data.iterator();
128 while (iterator.hasNext()) {
129 KeyedObject ko = (KeyedObject) iterator.next();
130 if (ko.getKey().equals(key)) {
131 result = i;
132 }
133 i++;
134 }
135 return result;
136 }
137
138 /**
139 * Returns the keys.
140 *
141 * @return The keys (never <code>null</code>).
142 */
143 public List getKeys() {
144 List result = new java.util.ArrayList();
145 Iterator iterator = this.data.iterator();
146 while (iterator.hasNext()) {
147 KeyedObject ko = (KeyedObject) iterator.next();
148 result.add(ko.getKey());
149 }
150 return result;
151 }
152
153 /**
154 * Returns the object for a given key. If the key is not recognised, the
155 * method should return <code>null</code>.
156 *
157 * @param key the key.
158 *
159 * @return The object (possibly <code>null</code>).
160 */
161 public Object getObject(Comparable key) {
162 return getObject(getIndex(key));
163 }
164
165 /**
166 * Adds a new object to the collection, or overwrites an existing object.
167 * This is the same as the {@link #setObject(Comparable, Object)} method.
168 *
169 * @param key the key.
170 * @param object the object.
171 */
172 public void addObject(Comparable key, Object object) {
173 setObject(key, object);
174 }
175
176 /**
177 * Replaces an existing object, or adds a new object to the collection.
178 * This is the same as the {@link #addObject(Comparable, Object)}
179 * method.
180 *
181 * @param key the key.
182 * @param object the object.
183 */
184 public void setObject(Comparable key, Object object) {
185 int keyIndex = getIndex(key);
186 if (keyIndex >= 0) {
187 KeyedObject ko = (KeyedObject) this.data.get(keyIndex);
188 ko.setObject(object);
189 }
190 else {
191 KeyedObject ko = new KeyedObject(key, object);
192 this.data.add(ko);
193 }
194 }
195
196 /**
197 * Removes a value from the collection.
198 *
199 * @param index the index of the item to remove.
200 */
201 public void removeValue(int index) {
202 this.data.remove(index);
203 }
204
205 /**
206 * Removes a value from the collection.
207 *
208 * @param key the key of the item to remove.
209 */
210 public void removeValue(Comparable key) {
211 removeValue(getIndex(key));
212 }
213
214 /**
215 * Returns a clone of this object.
216 *
217 * @return A clone.
218 *
219 * @throws CloneNotSupportedException if there is a problem cloning.
220 */
221 public Object clone() throws CloneNotSupportedException {
222 KeyedObjects clone = (KeyedObjects) super.clone();
223 clone.data = new java.util.ArrayList();
224 Iterator iterator = this.data.iterator();
225 while (iterator.hasNext()) {
226 KeyedObject ko = (KeyedObject) iterator.next();
227 clone.data.add(ko.clone());
228 }
229 return clone;
230 }
231
232 /**
233 * Tests if this object is equal to another.
234 *
235 * @param o the other object.
236 *
237 * @return A boolean.
238 */
239 public boolean equals(Object o) {
240
241 if (o == null) {
242 return false;
243 }
244 if (o == this) {
245 return true;
246 }
247
248 if (!(o instanceof KeyedObjects)) {
249 return false;
250 }
251
252 KeyedObjects kos = (KeyedObjects) o;
253 int count = getItemCount();
254 if (count != kos.getItemCount()) {
255 return false;
256 }
257
258 for (int i = 0; i < count; i++) {
259 Comparable k1 = getKey(i);
260 Comparable k2 = kos.getKey(i);
261 if (!k1.equals(k2)) {
262 return false;
263 }
264 Object o1 = getObject(i);
265 Object o2 = kos.getObject(i);
266 if (o1 == null) {
267 if (o2 != null) {
268 return false;
269 }
270 }
271 else {
272 if (!o1.equals(o2)) {
273 return false;
274 }
275 }
276 }
277 return true;
278
279 }
280
281 }