Fix ListOrderedSet to add new factory and direct constructor

git-svn-id: https://svn.apache.org/repos/asf/jakarta/commons/proper/collections/trunk@131776 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Stephen Colebourne 2004-06-07 21:42:12 +00:00
parent e81125154e
commit cb39538c27
5 changed files with 247 additions and 5 deletions

View File

@ -62,6 +62,8 @@ No deprecations have occurred.
<li>LRUMap - Add boolean flag, scanUntilRemovable, giving the removeLRU() method more power [28887]</li> <li>LRUMap - Add boolean flag, scanUntilRemovable, giving the removeLRU() method more power [28887]</li>
<li>InvokerTransformer - Add additional getInstance() method</li> <li>InvokerTransformer - Add additional getInstance() method</li>
<li>Reduced inter-class and inter-package dependencies, especially via *Utils classes</li> <li>Reduced inter-class and inter-package dependencies, especially via *Utils classes</li>
<li>ListOrderedSet - Add new factory method decorate(Set,List)</li>
<li>ListOrderedSet - Add constructor that uses a HashSet and ArrayList</li>
</ul> </ul>
<h4>Made Serializable</h4> <h4>Made Serializable</h4>
@ -93,6 +95,7 @@ No deprecations have occurred.
<li>EnumIterator/MapUtils - Changed enum references to enable JDK 1.5 compliance</li> <li>EnumIterator/MapUtils - Changed enum references to enable JDK 1.5 compliance</li>
<li>UnmodifiableSortedBag - Fix to ensure unmodifiable</li> <li>UnmodifiableSortedBag - Fix to ensure unmodifiable</li>
<li>MultiHashMap - Fix copy constructor and clone to work properly [28972]</li> <li>MultiHashMap - Fix copy constructor and clone to work properly [28972]</li>
<li>ListOrderedSet - Fix to throw IllegalArgumentException instead of NPE on null factory decorate(List)</li>
</ul> </ul>
<center><h3>JAVADOC</h3></center> <center><h3>JAVADOC</h3></center>

View File

@ -44,7 +44,7 @@ import org.apache.commons.collections.list.UnmodifiableList;
* This class is Serializable from Commons Collections 3.1. * This class is Serializable from Commons Collections 3.1.
* *
* @since Commons Collections 3.0 * @since Commons Collections 3.0
* @version $Revision: 1.8 $ $Date: 2004/06/03 22:02:13 $ * @version $Revision: 1.9 $ $Date: 2004/06/07 21:42:12 $
* *
* @author Stephen Colebourne * @author Stephen Colebourne
* @author Henning P. Schmiedehausen * @author Henning P. Schmiedehausen
@ -57,6 +57,28 @@ public class ListOrderedSet extends AbstractSerializableSetDecorator implements
/** Internal list to hold the sequence of objects */ /** Internal list to hold the sequence of objects */
protected final List setOrder; protected final List setOrder;
/**
* Factory method to create an ordered set specifying the list and set to use.
*
* @param set the set to decorate, must be empty and not null
* @param list the list to decorate, must be empty and not null
* @throws IllegalArgumentException if set or list is null
* @throws IllegalArgumentException if either the set or list is not empty
* @since Commons Collections 3.1
*/
public static ListOrderedSet decorate(Set set, List list) {
if (set == null) {
throw new IllegalArgumentException("Set must not be null");
}
if (list == null) {
throw new IllegalArgumentException("List must not be null");
}
if (set.size() > 0 || list.size() > 0) {
throw new IllegalArgumentException("Set and List must be empty");
}
return new ListOrderedSet(set, list);
}
/** /**
* Factory method to create an ordered set. * Factory method to create an ordered set.
* <p> * <p>
@ -75,9 +97,12 @@ public class ListOrderedSet extends AbstractSerializableSetDecorator implements
* A <code>HashSet</code> is used for the set behaviour. * A <code>HashSet</code> is used for the set behaviour.
* *
* @param list the list to decorate, must not be null * @param list the list to decorate, must not be null
* @throws IllegalArgumentException if set is null * @throws IllegalArgumentException if list is null
*/ */
public static ListOrderedSet decorate(List list) { public static ListOrderedSet decorate(List list) {
if (list == null) {
throw new IllegalArgumentException("List must not be null");
}
Set set = new HashSet(list); Set set = new HashSet(list);
list.retainAll(set); list.retainAll(set);
@ -85,6 +110,17 @@ public class ListOrderedSet extends AbstractSerializableSetDecorator implements
} }
//----------------------------------------------------------------------- //-----------------------------------------------------------------------
/**
* Constructs a new empty <code>ListOrderedSet</code> using
* a <code>HashSet</code> and an <code>ArrayList</code> internally.
*
* @since Commons Collections 3.1
*/
public ListOrderedSet() {
super(new HashSet());
setOrder = new ArrayList();
}
/** /**
* Constructor that wraps (not copies). * Constructor that wraps (not copies).
* *

View File

@ -23,7 +23,7 @@ import junit.framework.TestSuite;
* Entry point for tests. * Entry point for tests.
* *
* @since Commons Collections 3.0 * @since Commons Collections 3.0
* @version $Revision: 1.8 $ $Date: 2004/06/02 22:12:14 $ * @version $Revision: 1.9 $ $Date: 2004/06/07 21:42:12 $
* *
* @author Stephen Colebourne * @author Stephen Colebourne
*/ */
@ -43,6 +43,7 @@ public class TestAll extends TestCase {
suite.addTest(TestCompositeSet.suite()); suite.addTest(TestCompositeSet.suite());
suite.addTest(TestListOrderedSet.suite()); suite.addTest(TestListOrderedSet.suite());
suite.addTest(TestListOrderedSet2.suite());
suite.addTest(TestMapBackedSet.suite()); suite.addTest(TestMapBackedSet.suite());
suite.addTest(TestMapBackedSet2.suite()); suite.addTest(TestMapBackedSet2.suite());
suite.addTest(TestPredicatedSet.suite()); suite.addTest(TestPredicatedSet.suite());

View File

@ -29,7 +29,7 @@ import junit.framework.TestSuite;
* implementation. * implementation.
* *
* @since Commons Collections 3.0 * @since Commons Collections 3.0
* @version $Revision: 1.6 $ $Date: 2004/06/02 22:12:14 $ * @version $Revision: 1.7 $ $Date: 2004/06/07 21:42:12 $
* *
* @author Henning P. Schmiedehausen * @author Henning P. Schmiedehausen
* @author Stephen Colebourne * @author Stephen Colebourne
@ -165,7 +165,30 @@ public class TestListOrderedSet extends AbstractTestSet {
assertSame(TWO, set.get(2)); assertSame(TWO, set.get(2));
assertSame(ONE, set.get(3)); assertSame(ONE, set.get(3));
} }
public void testDecorator() {
try {
ListOrderedSet.decorate((List) null);
fail();
} catch (IllegalArgumentException ex) {}
try {
ListOrderedSet.decorate((Set) null);
fail();
} catch (IllegalArgumentException ex) {}
try {
ListOrderedSet.decorate(null, null);
fail();
} catch (IllegalArgumentException ex) {}
try {
ListOrderedSet.decorate(new HashSet(), null);
fail();
} catch (IllegalArgumentException ex) {}
try {
ListOrderedSet.decorate(null, new ArrayList());
fail();
} catch (IllegalArgumentException ex) {}
}
public String getCompatibilityVersion() { public String getCompatibilityVersion() {
return "3.1"; return "3.1";
} }

View File

@ -0,0 +1,179 @@
/*
* Copyright 2004 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.commons.collections.set;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import junit.framework.Test;
import junit.framework.TestSuite;
/**
* Extension of {@link TestSet} for exercising the {@link ListOrderedSet}
* implementation.
*
* @since Commons Collections 3.1
* @version $Revision: 1.1 $ $Date: 2004/06/07 21:42:12 $
*
* @author Henning P. Schmiedehausen
* @author Stephen Colebourne
*/
public class TestListOrderedSet2 extends AbstractTestSet {
public TestListOrderedSet2(String testName) {
super(testName);
}
public static Test suite() {
return new TestSuite(TestListOrderedSet2.class);
}
public static void main(String args[]) {
String[] testCaseName = { TestListOrderedSet2.class.getName()};
junit.textui.TestRunner.main(testCaseName);
}
public Set makeEmptySet() {
return new ListOrderedSet();
}
protected Set setupSet() {
Set set = makeEmptySet();
for (int i = 0; i < 10; i++) {
set.add(Integer.toString(i));
}
return set;
}
public void testOrdering() {
Set set = setupSet();
Iterator it = set.iterator();
for (int i = 0; i < 10; i++) {
assertEquals("Sequence is wrong", Integer.toString(i), it.next());
}
for (int i = 0; i < 10; i += 2) {
assertTrue("Must be able to remove int", set.remove(Integer.toString(i)));
}
it = set.iterator();
for (int i = 1; i < 10; i += 2) {
assertEquals("Sequence is wrong after remove ", Integer.toString(i), it.next());
}
for (int i = 0; i < 10; i++) {
set.add(Integer.toString(i));
}
assertEquals("Size of set is wrong!", 10, set.size());
it = set.iterator();
for (int i = 1; i < 10; i += 2) {
assertEquals("Sequence is wrong", Integer.toString(i), it.next());
}
for (int i = 0; i < 10; i += 2) {
assertEquals("Sequence is wrong", Integer.toString(i), it.next());
}
}
private static final Integer ZERO = new Integer(0);
private static final Integer ONE = new Integer(1);
private static final Integer TWO = new Integer(2);
private static final Integer THREE = new Integer(3);
public void testListAddRemove() {
ListOrderedSet set = (ListOrderedSet) makeEmptySet();
List view = set.asList();
set.add(ZERO);
set.add(ONE);
set.add(TWO);
assertEquals(3, set.size());
assertSame(ZERO, set.get(0));
assertSame(ONE, set.get(1));
assertSame(TWO, set.get(2));
assertEquals(3, view.size());
assertSame(ZERO, view.get(0));
assertSame(ONE, view.get(1));
assertSame(TWO, view.get(2));
assertEquals(0, set.indexOf(ZERO));
assertEquals(1, set.indexOf(ONE));
assertEquals(2, set.indexOf(TWO));
set.remove(1);
assertEquals(2, set.size());
assertSame(ZERO, set.get(0));
assertSame(TWO, set.get(1));
assertEquals(2, view.size());
assertSame(ZERO, view.get(0));
assertSame(TWO, view.get(1));
}
public void testListAddIndexed() {
ListOrderedSet set = (ListOrderedSet) makeEmptySet();
List view = set.asList();
set.add(ZERO);
set.add(TWO);
set.add(1, ONE);
assertEquals(3, set.size());
assertSame(ZERO, set.get(0));
assertSame(ONE, set.get(1));
assertSame(TWO, set.get(2));
set.add(0, ONE);
assertEquals(3, set.size());
assertSame(ZERO, set.get(0));
assertSame(ONE, set.get(1));
assertSame(TWO, set.get(2));
List list = new ArrayList();
list.add(ZERO);
list.add(TWO);
set.addAll(0, list);
assertEquals(3, set.size());
assertSame(ZERO, set.get(0));
assertSame(ONE, set.get(1));
assertSame(TWO, set.get(2));
list.add(0, THREE); // list = [3,0,2]
set.remove(TWO); // set = [0,1]
set.addAll(1, list);
assertEquals(4, set.size());
assertSame(ZERO, set.get(0));
assertSame(THREE, set.get(1));
assertSame(TWO, set.get(2));
assertSame(ONE, set.get(3));
}
public String getCompatibilityVersion() {
return "3.1";
}
// public void testCreate() throws Exception {
// resetEmpty();
// writeExternalFormToDisk((java.io.Serializable) collection, "D:/dev/collections/data/test/ListOrderedSet.emptyCollection.version3.1.obj");
// resetFull();
// writeExternalFormToDisk((java.io.Serializable) collection, "D:/dev/collections/data/test/ListOrderedSet.fullCollection.version3.1.obj");
// }
}