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:
parent
e81125154e
commit
cb39538c27
|
@ -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>
|
||||||
|
|
|
@ -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).
|
||||||
*
|
*
|
||||||
|
|
|
@ -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());
|
||||||
|
|
|
@ -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";
|
||||||
}
|
}
|
||||||
|
|
|
@ -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");
|
||||||
|
// }
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue