mirror of https://github.com/apache/poi.git
As Jdk 1.5 doesn't provide NavigableMap/Set classes of JDK 1.6, we temporarily use the open jdk classes instead, until POI has switched to JDK 1.6
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1561500 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
78115109d2
commit
655dee9f1f
|
@ -0,0 +1,828 @@
|
|||
/*
|
||||
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package org.apache.poi.util.java7_util;
|
||||
|
||||
import java.util.AbstractCollection;
|
||||
import java.util.AbstractSet;
|
||||
import java.util.Collection;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* This class provides a skeletal implementation of the <tt>Map</tt>
|
||||
* interface, to minimize the effort required to implement this interface.
|
||||
*
|
||||
* <p>To implement an unmodifiable map, the programmer needs only to extend this
|
||||
* class and provide an implementation for the <tt>entrySet</tt> method, which
|
||||
* returns a set-view of the map's mappings. Typically, the returned set
|
||||
* will, in turn, be implemented atop <tt>AbstractSet</tt>. This set should
|
||||
* not support the <tt>add</tt> or <tt>remove</tt> methods, and its iterator
|
||||
* should not support the <tt>remove</tt> method.
|
||||
*
|
||||
* <p>To implement a modifiable map, the programmer must additionally override
|
||||
* this class's <tt>put</tt> method (which otherwise throws an
|
||||
* <tt>UnsupportedOperationException</tt>), and the iterator returned by
|
||||
* <tt>entrySet().iterator()</tt> must additionally implement its
|
||||
* <tt>remove</tt> method.
|
||||
*
|
||||
* <p>The programmer should generally provide a void (no argument) and map
|
||||
* constructor, as per the recommendation in the <tt>Map</tt> interface
|
||||
* specification.
|
||||
*
|
||||
* <p>The documentation for each non-abstract method in this class describes its
|
||||
* implementation in detail. Each of these methods may be overridden if the
|
||||
* map being implemented admits a more efficient implementation.
|
||||
*
|
||||
* <p>This class is a member of the
|
||||
* <a href="{@docRoot}/../technotes/guides/collections/index.html">
|
||||
* Java Collections Framework</a>.
|
||||
*
|
||||
* @param <K> the type of keys maintained by this map
|
||||
* @param <V> the type of mapped values
|
||||
*
|
||||
* @author Josh Bloch
|
||||
* @author Neal Gafter
|
||||
* @see Map
|
||||
* @see Collection
|
||||
* @since 1.2
|
||||
*/
|
||||
|
||||
public abstract class AbstractMap7<K,V> implements Map<K,V> {
|
||||
/**
|
||||
* Sole constructor. (For invocation by subclass constructors, typically
|
||||
* implicit.)
|
||||
*/
|
||||
protected AbstractMap7() {
|
||||
}
|
||||
|
||||
// Query Operations
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>This implementation returns <tt>entrySet().size()</tt>.
|
||||
*/
|
||||
public int size() {
|
||||
return entrySet().size();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>This implementation returns <tt>size() == 0</tt>.
|
||||
*/
|
||||
public boolean isEmpty() {
|
||||
return size() == 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>This implementation iterates over <tt>entrySet()</tt> searching
|
||||
* for an entry with the specified value. If such an entry is found,
|
||||
* <tt>true</tt> is returned. If the iteration terminates without
|
||||
* finding such an entry, <tt>false</tt> is returned. Note that this
|
||||
* implementation requires linear time in the size of the map.
|
||||
*
|
||||
* @throws ClassCastException {@inheritDoc}
|
||||
* @throws NullPointerException {@inheritDoc}
|
||||
*/
|
||||
public boolean containsValue(Object value) {
|
||||
Iterator<Entry<K,V>> i = entrySet().iterator();
|
||||
if (value==null) {
|
||||
while (i.hasNext()) {
|
||||
Entry<K,V> e = i.next();
|
||||
if (e.getValue()==null)
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
while (i.hasNext()) {
|
||||
Entry<K,V> e = i.next();
|
||||
if (value.equals(e.getValue()))
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>This implementation iterates over <tt>entrySet()</tt> searching
|
||||
* for an entry with the specified key. If such an entry is found,
|
||||
* <tt>true</tt> is returned. If the iteration terminates without
|
||||
* finding such an entry, <tt>false</tt> is returned. Note that this
|
||||
* implementation requires linear time in the size of the map; many
|
||||
* implementations will override this method.
|
||||
*
|
||||
* @throws ClassCastException {@inheritDoc}
|
||||
* @throws NullPointerException {@inheritDoc}
|
||||
*/
|
||||
public boolean containsKey(Object key) {
|
||||
Iterator<Map.Entry<K,V>> i = entrySet().iterator();
|
||||
if (key==null) {
|
||||
while (i.hasNext()) {
|
||||
Entry<K,V> e = i.next();
|
||||
if (e.getKey()==null)
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
while (i.hasNext()) {
|
||||
Entry<K,V> e = i.next();
|
||||
if (key.equals(e.getKey()))
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>This implementation iterates over <tt>entrySet()</tt> searching
|
||||
* for an entry with the specified key. If such an entry is found,
|
||||
* the entry's value is returned. If the iteration terminates without
|
||||
* finding such an entry, <tt>null</tt> is returned. Note that this
|
||||
* implementation requires linear time in the size of the map; many
|
||||
* implementations will override this method.
|
||||
*
|
||||
* @throws ClassCastException {@inheritDoc}
|
||||
* @throws NullPointerException {@inheritDoc}
|
||||
*/
|
||||
public V get(Object key) {
|
||||
Iterator<Entry<K,V>> i = entrySet().iterator();
|
||||
if (key==null) {
|
||||
while (i.hasNext()) {
|
||||
Entry<K,V> e = i.next();
|
||||
if (e.getKey()==null)
|
||||
return e.getValue();
|
||||
}
|
||||
} else {
|
||||
while (i.hasNext()) {
|
||||
Entry<K,V> e = i.next();
|
||||
if (key.equals(e.getKey()))
|
||||
return e.getValue();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
// Modification Operations
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>This implementation always throws an
|
||||
* <tt>UnsupportedOperationException</tt>.
|
||||
*
|
||||
* @throws UnsupportedOperationException {@inheritDoc}
|
||||
* @throws ClassCastException {@inheritDoc}
|
||||
* @throws NullPointerException {@inheritDoc}
|
||||
* @throws IllegalArgumentException {@inheritDoc}
|
||||
*/
|
||||
public V put(K key, V value) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>This implementation iterates over <tt>entrySet()</tt> searching for an
|
||||
* entry with the specified key. If such an entry is found, its value is
|
||||
* obtained with its <tt>getValue</tt> operation, the entry is removed
|
||||
* from the collection (and the backing map) with the iterator's
|
||||
* <tt>remove</tt> operation, and the saved value is returned. If the
|
||||
* iteration terminates without finding such an entry, <tt>null</tt> is
|
||||
* returned. Note that this implementation requires linear time in the
|
||||
* size of the map; many implementations will override this method.
|
||||
*
|
||||
* <p>Note that this implementation throws an
|
||||
* <tt>UnsupportedOperationException</tt> if the <tt>entrySet</tt>
|
||||
* iterator does not support the <tt>remove</tt> method and this map
|
||||
* contains a mapping for the specified key.
|
||||
*
|
||||
* @throws UnsupportedOperationException {@inheritDoc}
|
||||
* @throws ClassCastException {@inheritDoc}
|
||||
* @throws NullPointerException {@inheritDoc}
|
||||
*/
|
||||
public V remove(Object key) {
|
||||
Iterator<Entry<K,V>> i = entrySet().iterator();
|
||||
Entry<K,V> correctEntry = null;
|
||||
if (key==null) {
|
||||
while (correctEntry==null && i.hasNext()) {
|
||||
Entry<K,V> e = i.next();
|
||||
if (e.getKey()==null)
|
||||
correctEntry = e;
|
||||
}
|
||||
} else {
|
||||
while (correctEntry==null && i.hasNext()) {
|
||||
Entry<K,V> e = i.next();
|
||||
if (key.equals(e.getKey()))
|
||||
correctEntry = e;
|
||||
}
|
||||
}
|
||||
|
||||
V oldValue = null;
|
||||
if (correctEntry !=null) {
|
||||
oldValue = correctEntry.getValue();
|
||||
i.remove();
|
||||
}
|
||||
return oldValue;
|
||||
}
|
||||
|
||||
|
||||
// Bulk Operations
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>This implementation iterates over the specified map's
|
||||
* <tt>entrySet()</tt> collection, and calls this map's <tt>put</tt>
|
||||
* operation once for each entry returned by the iteration.
|
||||
*
|
||||
* <p>Note that this implementation throws an
|
||||
* <tt>UnsupportedOperationException</tt> if this map does not support
|
||||
* the <tt>put</tt> operation and the specified map is nonempty.
|
||||
*
|
||||
* @throws UnsupportedOperationException {@inheritDoc}
|
||||
* @throws ClassCastException {@inheritDoc}
|
||||
* @throws NullPointerException {@inheritDoc}
|
||||
* @throws IllegalArgumentException {@inheritDoc}
|
||||
*/
|
||||
public void putAll(Map<? extends K, ? extends V> m) {
|
||||
for (Map.Entry<? extends K, ? extends V> e : m.entrySet())
|
||||
put(e.getKey(), e.getValue());
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>This implementation calls <tt>entrySet().clear()</tt>.
|
||||
*
|
||||
* <p>Note that this implementation throws an
|
||||
* <tt>UnsupportedOperationException</tt> if the <tt>entrySet</tt>
|
||||
* does not support the <tt>clear</tt> operation.
|
||||
*
|
||||
* @throws UnsupportedOperationException {@inheritDoc}
|
||||
*/
|
||||
public void clear() {
|
||||
entrySet().clear();
|
||||
}
|
||||
|
||||
|
||||
// Views
|
||||
|
||||
/**
|
||||
* Each of these fields are initialized to contain an instance of the
|
||||
* appropriate view the first time this view is requested. The views are
|
||||
* stateless, so there's no reason to create more than one of each.
|
||||
*/
|
||||
transient volatile Set<K> keySet = null;
|
||||
transient volatile Collection<V> values = null;
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>This implementation returns a set that subclasses {@link AbstractSet}.
|
||||
* The subclass's iterator method returns a "wrapper object" over this
|
||||
* map's <tt>entrySet()</tt> iterator. The <tt>size</tt> method
|
||||
* delegates to this map's <tt>size</tt> method and the
|
||||
* <tt>contains</tt> method delegates to this map's
|
||||
* <tt>containsKey</tt> method.
|
||||
*
|
||||
* <p>The set is created the first time this method is called,
|
||||
* and returned in response to all subsequent calls. No synchronization
|
||||
* is performed, so there is a slight chance that multiple calls to this
|
||||
* method will not all return the same set.
|
||||
*/
|
||||
public Set<K> keySet() {
|
||||
if (keySet == null) {
|
||||
keySet = new AbstractSet<K>() {
|
||||
public Iterator<K> iterator() {
|
||||
return new Iterator<K>() {
|
||||
private Iterator<Entry<K,V>> i = entrySet().iterator();
|
||||
|
||||
public boolean hasNext() {
|
||||
return i.hasNext();
|
||||
}
|
||||
|
||||
public K next() {
|
||||
return i.next().getKey();
|
||||
}
|
||||
|
||||
public void remove() {
|
||||
i.remove();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public int size() {
|
||||
return AbstractMap7.this.size();
|
||||
}
|
||||
|
||||
public boolean isEmpty() {
|
||||
return AbstractMap7.this.isEmpty();
|
||||
}
|
||||
|
||||
public void clear() {
|
||||
AbstractMap7.this.clear();
|
||||
}
|
||||
|
||||
public boolean contains(Object k) {
|
||||
return AbstractMap7.this.containsKey(k);
|
||||
}
|
||||
};
|
||||
}
|
||||
return keySet;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>This implementation returns a collection that subclasses {@link
|
||||
* AbstractCollection}. The subclass's iterator method returns a
|
||||
* "wrapper object" over this map's <tt>entrySet()</tt> iterator.
|
||||
* The <tt>size</tt> method delegates to this map's <tt>size</tt>
|
||||
* method and the <tt>contains</tt> method delegates to this map's
|
||||
* <tt>containsValue</tt> method.
|
||||
*
|
||||
* <p>The collection is created the first time this method is called, and
|
||||
* returned in response to all subsequent calls. No synchronization is
|
||||
* performed, so there is a slight chance that multiple calls to this
|
||||
* method will not all return the same collection.
|
||||
*/
|
||||
public Collection<V> values() {
|
||||
if (values == null) {
|
||||
values = new AbstractCollection<V>() {
|
||||
public Iterator<V> iterator() {
|
||||
return new Iterator<V>() {
|
||||
private Iterator<Entry<K,V>> i = entrySet().iterator();
|
||||
|
||||
public boolean hasNext() {
|
||||
return i.hasNext();
|
||||
}
|
||||
|
||||
public V next() {
|
||||
return i.next().getValue();
|
||||
}
|
||||
|
||||
public void remove() {
|
||||
i.remove();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public int size() {
|
||||
return AbstractMap7.this.size();
|
||||
}
|
||||
|
||||
public boolean isEmpty() {
|
||||
return AbstractMap7.this.isEmpty();
|
||||
}
|
||||
|
||||
public void clear() {
|
||||
AbstractMap7.this.clear();
|
||||
}
|
||||
|
||||
public boolean contains(Object v) {
|
||||
return AbstractMap7.this.containsValue(v);
|
||||
}
|
||||
};
|
||||
}
|
||||
return values;
|
||||
}
|
||||
|
||||
public abstract Set<Entry<K,V>> entrySet();
|
||||
|
||||
|
||||
// Comparison and hashing
|
||||
|
||||
/**
|
||||
* Compares the specified object with this map for equality. Returns
|
||||
* <tt>true</tt> if the given object is also a map and the two maps
|
||||
* represent the same mappings. More formally, two maps <tt>m1</tt> and
|
||||
* <tt>m2</tt> represent the same mappings if
|
||||
* <tt>m1.entrySet().equals(m2.entrySet())</tt>. This ensures that the
|
||||
* <tt>equals</tt> method works properly across different implementations
|
||||
* of the <tt>Map</tt> interface.
|
||||
*
|
||||
* <p>This implementation first checks if the specified object is this map;
|
||||
* if so it returns <tt>true</tt>. Then, it checks if the specified
|
||||
* object is a map whose size is identical to the size of this map; if
|
||||
* not, it returns <tt>false</tt>. If so, it iterates over this map's
|
||||
* <tt>entrySet</tt> collection, and checks that the specified map
|
||||
* contains each mapping that this map contains. If the specified map
|
||||
* fails to contain such a mapping, <tt>false</tt> is returned. If the
|
||||
* iteration completes, <tt>true</tt> is returned.
|
||||
*
|
||||
* @param o object to be compared for equality with this map
|
||||
* @return <tt>true</tt> if the specified object is equal to this map
|
||||
*/
|
||||
public boolean equals(Object o) {
|
||||
if (o == this)
|
||||
return true;
|
||||
|
||||
if (!(o instanceof Map))
|
||||
return false;
|
||||
Map<K,V> m = (Map<K,V>) o;
|
||||
if (m.size() != size())
|
||||
return false;
|
||||
|
||||
try {
|
||||
Iterator<Entry<K,V>> i = entrySet().iterator();
|
||||
while (i.hasNext()) {
|
||||
Entry<K,V> e = i.next();
|
||||
K key = e.getKey();
|
||||
V value = e.getValue();
|
||||
if (value == null) {
|
||||
if (!(m.get(key)==null && m.containsKey(key)))
|
||||
return false;
|
||||
} else {
|
||||
if (!value.equals(m.get(key)))
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} catch (ClassCastException unused) {
|
||||
return false;
|
||||
} catch (NullPointerException unused) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the hash code value for this map. The hash code of a map is
|
||||
* defined to be the sum of the hash codes of each entry in the map's
|
||||
* <tt>entrySet()</tt> view. This ensures that <tt>m1.equals(m2)</tt>
|
||||
* implies that <tt>m1.hashCode()==m2.hashCode()</tt> for any two maps
|
||||
* <tt>m1</tt> and <tt>m2</tt>, as required by the general contract of
|
||||
* {@link Object#hashCode}.
|
||||
*
|
||||
* <p>This implementation iterates over <tt>entrySet()</tt>, calling
|
||||
* {@link Map.Entry#hashCode hashCode()} on each element (entry) in the
|
||||
* set, and adding up the results.
|
||||
*
|
||||
* @return the hash code value for this map
|
||||
* @see Map.Entry#hashCode()
|
||||
* @see Object#equals(Object)
|
||||
* @see Set#equals(Object)
|
||||
*/
|
||||
public int hashCode() {
|
||||
int h = 0;
|
||||
Iterator<Entry<K,V>> i = entrySet().iterator();
|
||||
while (i.hasNext())
|
||||
h += i.next().hashCode();
|
||||
return h;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of this map. The string representation
|
||||
* consists of a list of key-value mappings in the order returned by the
|
||||
* map's <tt>entrySet</tt> view's iterator, enclosed in braces
|
||||
* (<tt>"{}"</tt>). Adjacent mappings are separated by the characters
|
||||
* <tt>", "</tt> (comma and space). Each key-value mapping is rendered as
|
||||
* the key followed by an equals sign (<tt>"="</tt>) followed by the
|
||||
* associated value. Keys and values are converted to strings as by
|
||||
* {@link String#valueOf(Object)}.
|
||||
*
|
||||
* @return a string representation of this map
|
||||
*/
|
||||
public String toString() {
|
||||
Iterator<Entry<K,V>> i = entrySet().iterator();
|
||||
if (! i.hasNext())
|
||||
return "{}";
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append('{');
|
||||
for (;;) {
|
||||
Entry<K,V> e = i.next();
|
||||
K key = e.getKey();
|
||||
V value = e.getValue();
|
||||
sb.append(key == this ? "(this Map)" : key);
|
||||
sb.append('=');
|
||||
sb.append(value == this ? "(this Map)" : value);
|
||||
if (! i.hasNext())
|
||||
return sb.append('}').toString();
|
||||
sb.append(',').append(' ');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a shallow copy of this <tt>AbstractMap7</tt> instance: the keys
|
||||
* and values themselves are not cloned.
|
||||
*
|
||||
* @return a shallow copy of this map
|
||||
*/
|
||||
protected Object clone() throws CloneNotSupportedException {
|
||||
AbstractMap7<K,V> result = (AbstractMap7<K,V>)super.clone();
|
||||
result.keySet = null;
|
||||
result.values = null;
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Utility method for SimpleEntry and SimpleImmutableEntry.
|
||||
* Test for equality, checking for nulls.
|
||||
*/
|
||||
private static boolean eq(Object o1, Object o2) {
|
||||
return o1 == null ? o2 == null : o1.equals(o2);
|
||||
}
|
||||
|
||||
// Implementation Note: SimpleEntry and SimpleImmutableEntry
|
||||
// are distinct unrelated classes, even though they share
|
||||
// some code. Since you can't add or subtract final-ness
|
||||
// of a field in a subclass, they can't share representations,
|
||||
// and the amount of duplicated code is too small to warrant
|
||||
// exposing a common abstract class.
|
||||
|
||||
|
||||
/**
|
||||
* An Entry maintaining a key and a value. The value may be
|
||||
* changed using the <tt>setValue</tt> method. This class
|
||||
* facilitates the process of building custom map
|
||||
* implementations. For example, it may be convenient to return
|
||||
* arrays of <tt>SimpleEntry</tt> instances in method
|
||||
* <tt>Map.entrySet().toArray</tt>.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
public static class SimpleEntry<K,V>
|
||||
implements Entry<K,V>, java.io.Serializable
|
||||
{
|
||||
private static final long serialVersionUID = -8499721149061103585L;
|
||||
|
||||
private final K key;
|
||||
private V value;
|
||||
|
||||
/**
|
||||
* Creates an entry representing a mapping from the specified
|
||||
* key to the specified value.
|
||||
*
|
||||
* @param key the key represented by this entry
|
||||
* @param value the value represented by this entry
|
||||
*/
|
||||
public SimpleEntry(K key, V value) {
|
||||
this.key = key;
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an entry representing the same mapping as the
|
||||
* specified entry.
|
||||
*
|
||||
* @param entry the entry to copy
|
||||
*/
|
||||
public SimpleEntry(Entry<? extends K, ? extends V> entry) {
|
||||
this.key = entry.getKey();
|
||||
this.value = entry.getValue();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the key corresponding to this entry.
|
||||
*
|
||||
* @return the key corresponding to this entry
|
||||
*/
|
||||
public K getKey() {
|
||||
return key;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the value corresponding to this entry.
|
||||
*
|
||||
* @return the value corresponding to this entry
|
||||
*/
|
||||
public V getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Replaces the value corresponding to this entry with the specified
|
||||
* value.
|
||||
*
|
||||
* @param value new value to be stored in this entry
|
||||
* @return the old value corresponding to the entry
|
||||
*/
|
||||
public V setValue(V value) {
|
||||
V oldValue = this.value;
|
||||
this.value = value;
|
||||
return oldValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* Compares the specified object with this entry for equality.
|
||||
* Returns {@code true} if the given object is also a map entry and
|
||||
* the two entries represent the same mapping. More formally, two
|
||||
* entries {@code e1} and {@code e2} represent the same mapping
|
||||
* if<pre>
|
||||
* (e1.getKey()==null ?
|
||||
* e2.getKey()==null :
|
||||
* e1.getKey().equals(e2.getKey()))
|
||||
* &&
|
||||
* (e1.getValue()==null ?
|
||||
* e2.getValue()==null :
|
||||
* e1.getValue().equals(e2.getValue()))</pre>
|
||||
* This ensures that the {@code equals} method works properly across
|
||||
* different implementations of the {@code Map.Entry} interface.
|
||||
*
|
||||
* @param o object to be compared for equality with this map entry
|
||||
* @return {@code true} if the specified object is equal to this map
|
||||
* entry
|
||||
* @see #hashCode
|
||||
*/
|
||||
public boolean equals(Object o) {
|
||||
if (!(o instanceof Map.Entry))
|
||||
return false;
|
||||
Map.Entry e = (Map.Entry)o;
|
||||
return eq(key, e.getKey()) && eq(value, e.getValue());
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the hash code value for this map entry. The hash code
|
||||
* of a map entry {@code e} is defined to be: <pre>
|
||||
* (e.getKey()==null ? 0 : e.getKey().hashCode()) ^
|
||||
* (e.getValue()==null ? 0 : e.getValue().hashCode())</pre>
|
||||
* This ensures that {@code e1.equals(e2)} implies that
|
||||
* {@code e1.hashCode()==e2.hashCode()} for any two Entries
|
||||
* {@code e1} and {@code e2}, as required by the general
|
||||
* contract of {@link Object#hashCode}.
|
||||
*
|
||||
* @return the hash code value for this map entry
|
||||
* @see #equals
|
||||
*/
|
||||
public int hashCode() {
|
||||
return (key == null ? 0 : key.hashCode()) ^
|
||||
(value == null ? 0 : value.hashCode());
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a String representation of this map entry. This
|
||||
* implementation returns the string representation of this
|
||||
* entry's key followed by the equals character ("<tt>=</tt>")
|
||||
* followed by the string representation of this entry's value.
|
||||
*
|
||||
* @return a String representation of this map entry
|
||||
*/
|
||||
public String toString() {
|
||||
return key + "=" + value;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* An Entry maintaining an immutable key and value. This class
|
||||
* does not support method <tt>setValue</tt>. This class may be
|
||||
* convenient in methods that return thread-safe snapshots of
|
||||
* key-value mappings.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
public static class SimpleImmutableEntry<K,V>
|
||||
implements Entry<K,V>, java.io.Serializable
|
||||
{
|
||||
private static final long serialVersionUID = 7138329143949025153L;
|
||||
|
||||
private final K key;
|
||||
private final V value;
|
||||
|
||||
/**
|
||||
* Creates an entry representing a mapping from the specified
|
||||
* key to the specified value.
|
||||
*
|
||||
* @param key the key represented by this entry
|
||||
* @param value the value represented by this entry
|
||||
*/
|
||||
public SimpleImmutableEntry(K key, V value) {
|
||||
this.key = key;
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an entry representing the same mapping as the
|
||||
* specified entry.
|
||||
*
|
||||
* @param entry the entry to copy
|
||||
*/
|
||||
public SimpleImmutableEntry(Entry<? extends K, ? extends V> entry) {
|
||||
this.key = entry.getKey();
|
||||
this.value = entry.getValue();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the key corresponding to this entry.
|
||||
*
|
||||
* @return the key corresponding to this entry
|
||||
*/
|
||||
public K getKey() {
|
||||
return key;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the value corresponding to this entry.
|
||||
*
|
||||
* @return the value corresponding to this entry
|
||||
*/
|
||||
public V getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Replaces the value corresponding to this entry with the specified
|
||||
* value (optional operation). This implementation simply throws
|
||||
* <tt>UnsupportedOperationException</tt>, as this class implements
|
||||
* an <i>immutable</i> map entry.
|
||||
*
|
||||
* @param value new value to be stored in this entry
|
||||
* @return (Does not return)
|
||||
* @throws UnsupportedOperationException always
|
||||
*/
|
||||
public V setValue(V value) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
/**
|
||||
* Compares the specified object with this entry for equality.
|
||||
* Returns {@code true} if the given object is also a map entry and
|
||||
* the two entries represent the same mapping. More formally, two
|
||||
* entries {@code e1} and {@code e2} represent the same mapping
|
||||
* if<pre>
|
||||
* (e1.getKey()==null ?
|
||||
* e2.getKey()==null :
|
||||
* e1.getKey().equals(e2.getKey()))
|
||||
* &&
|
||||
* (e1.getValue()==null ?
|
||||
* e2.getValue()==null :
|
||||
* e1.getValue().equals(e2.getValue()))</pre>
|
||||
* This ensures that the {@code equals} method works properly across
|
||||
* different implementations of the {@code Map.Entry} interface.
|
||||
*
|
||||
* @param o object to be compared for equality with this map entry
|
||||
* @return {@code true} if the specified object is equal to this map
|
||||
* entry
|
||||
* @see #hashCode
|
||||
*/
|
||||
public boolean equals(Object o) {
|
||||
if (!(o instanceof Map.Entry))
|
||||
return false;
|
||||
Map.Entry e = (Map.Entry)o;
|
||||
return eq(key, e.getKey()) && eq(value, e.getValue());
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the hash code value for this map entry. The hash code
|
||||
* of a map entry {@code e} is defined to be: <pre>
|
||||
* (e.getKey()==null ? 0 : e.getKey().hashCode()) ^
|
||||
* (e.getValue()==null ? 0 : e.getValue().hashCode())</pre>
|
||||
* This ensures that {@code e1.equals(e2)} implies that
|
||||
* {@code e1.hashCode()==e2.hashCode()} for any two Entries
|
||||
* {@code e1} and {@code e2}, as required by the general
|
||||
* contract of {@link Object#hashCode}.
|
||||
*
|
||||
* @return the hash code value for this map entry
|
||||
* @see #equals
|
||||
*/
|
||||
public int hashCode() {
|
||||
return (key == null ? 0 : key.hashCode()) ^
|
||||
(value == null ? 0 : value.hashCode());
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a String representation of this map entry. This
|
||||
* implementation returns the string representation of this
|
||||
* entry's key followed by the equals character ("<tt>=</tt>")
|
||||
* followed by the string representation of this entry's value.
|
||||
*
|
||||
* @return a String representation of this map entry
|
||||
*/
|
||||
public String toString() {
|
||||
return key + "=" + value;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,190 @@
|
|||
/*
|
||||
* Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package org.apache.poi.util.java7_util;
|
||||
|
||||
import java.util.AbstractCollection;
|
||||
import java.util.Collection;
|
||||
import java.util.Iterator;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* This class provides a skeletal implementation of the <tt>Set</tt>
|
||||
* interface to minimize the effort required to implement this
|
||||
* interface. <p>
|
||||
*
|
||||
* The process of implementing a set by extending this class is identical
|
||||
* to that of implementing a Collection by extending AbstractCollection,
|
||||
* except that all of the methods and constructors in subclasses of this
|
||||
* class must obey the additional constraints imposed by the <tt>Set</tt>
|
||||
* interface (for instance, the add method must not permit addition of
|
||||
* multiple instances of an object to a set).<p>
|
||||
*
|
||||
* Note that this class does not override any of the implementations from
|
||||
* the <tt>AbstractCollection</tt> class. It merely adds implementations
|
||||
* for <tt>equals</tt> and <tt>hashCode</tt>.<p>
|
||||
*
|
||||
* This class is a member of the
|
||||
* <a href="{@docRoot}/../technotes/guides/collections/index.html">
|
||||
* Java Collections Framework</a>.
|
||||
*
|
||||
* @param <E> the type of elements maintained by this set
|
||||
*
|
||||
* @author Josh Bloch
|
||||
* @author Neal Gafter
|
||||
* @see Collection
|
||||
* @see AbstractCollection
|
||||
* @see Set
|
||||
* @since 1.2
|
||||
*/
|
||||
|
||||
public abstract class AbstractSet7<E> extends AbstractCollection<E> implements Set<E> {
|
||||
/**
|
||||
* Sole constructor. (For invocation by subclass constructors, typically
|
||||
* implicit.)
|
||||
*/
|
||||
protected AbstractSet7() {
|
||||
}
|
||||
|
||||
// Comparison and hashing
|
||||
|
||||
/**
|
||||
* Compares the specified object with this set for equality. Returns
|
||||
* <tt>true</tt> if the given object is also a set, the two sets have
|
||||
* the same size, and every member of the given set is contained in
|
||||
* this set. This ensures that the <tt>equals</tt> method works
|
||||
* properly across different implementations of the <tt>Set</tt>
|
||||
* interface.<p>
|
||||
*
|
||||
* This implementation first checks if the specified object is this
|
||||
* set; if so it returns <tt>true</tt>. Then, it checks if the
|
||||
* specified object is a set whose size is identical to the size of
|
||||
* this set; if not, it returns false. If so, it returns
|
||||
* <tt>containsAll((Collection) o)</tt>.
|
||||
*
|
||||
* @param o object to be compared for equality with this set
|
||||
* @return <tt>true</tt> if the specified object is equal to this set
|
||||
*/
|
||||
public boolean equals(Object o) {
|
||||
if (o == this)
|
||||
return true;
|
||||
|
||||
if (!(o instanceof Set))
|
||||
return false;
|
||||
Collection c = (Collection) o;
|
||||
if (c.size() != size())
|
||||
return false;
|
||||
try {
|
||||
return containsAll(c);
|
||||
} catch (ClassCastException unused) {
|
||||
return false;
|
||||
} catch (NullPointerException unused) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the hash code value for this set. The hash code of a set is
|
||||
* defined to be the sum of the hash codes of the elements in the set,
|
||||
* where the hash code of a <tt>null</tt> element is defined to be zero.
|
||||
* This ensures that <tt>s1.equals(s2)</tt> implies that
|
||||
* <tt>s1.hashCode()==s2.hashCode()</tt> for any two sets <tt>s1</tt>
|
||||
* and <tt>s2</tt>, as required by the general contract of
|
||||
* {@link Object#hashCode}.
|
||||
*
|
||||
* <p>This implementation iterates over the set, calling the
|
||||
* <tt>hashCode</tt> method on each element in the set, and adding up
|
||||
* the results.
|
||||
*
|
||||
* @return the hash code value for this set
|
||||
* @see Object#equals(Object)
|
||||
* @see Set#equals(Object)
|
||||
*/
|
||||
public int hashCode() {
|
||||
int h = 0;
|
||||
Iterator<E> i = iterator();
|
||||
while (i.hasNext()) {
|
||||
E obj = i.next();
|
||||
if (obj != null)
|
||||
h += obj.hashCode();
|
||||
}
|
||||
return h;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes from this set all of its elements that are contained in the
|
||||
* specified collection (optional operation). If the specified
|
||||
* collection is also a set, this operation effectively modifies this
|
||||
* set so that its value is the <i>asymmetric set difference</i> of
|
||||
* the two sets.
|
||||
*
|
||||
* <p>This implementation determines which is the smaller of this set
|
||||
* and the specified collection, by invoking the <tt>size</tt>
|
||||
* method on each. If this set has fewer elements, then the
|
||||
* implementation iterates over this set, checking each element
|
||||
* returned by the iterator in turn to see if it is contained in
|
||||
* the specified collection. If it is so contained, it is removed
|
||||
* from this set with the iterator's <tt>remove</tt> method. If
|
||||
* the specified collection has fewer elements, then the
|
||||
* implementation iterates over the specified collection, removing
|
||||
* from this set each element returned by the iterator, using this
|
||||
* set's <tt>remove</tt> method.
|
||||
*
|
||||
* <p>Note that this implementation will throw an
|
||||
* <tt>UnsupportedOperationException</tt> if the iterator returned by the
|
||||
* <tt>iterator</tt> method does not implement the <tt>remove</tt> method.
|
||||
*
|
||||
* @param c collection containing elements to be removed from this set
|
||||
* @return <tt>true</tt> if this set changed as a result of the call
|
||||
* @throws UnsupportedOperationException if the <tt>removeAll</tt> operation
|
||||
* is not supported by this set
|
||||
* @throws ClassCastException if the class of an element of this set
|
||||
* is incompatible with the specified collection
|
||||
* (<a href="Collection.html#optional-restrictions">optional</a>)
|
||||
* @throws NullPointerException if this set contains a null element and the
|
||||
* specified collection does not permit null elements
|
||||
* (<a href="Collection.html#optional-restrictions">optional</a>),
|
||||
* or if the specified collection is null
|
||||
* @see #remove(Object)
|
||||
* @see #contains(Object)
|
||||
*/
|
||||
public boolean removeAll(Collection<?> c) {
|
||||
boolean modified = false;
|
||||
|
||||
if (size() > c.size()) {
|
||||
for (Iterator<?> i = c.iterator(); i.hasNext(); )
|
||||
modified |= remove(i.next());
|
||||
} else {
|
||||
for (Iterator<?> i = iterator(); i.hasNext(); ) {
|
||||
if (c.contains(i.next())) {
|
||||
i.remove();
|
||||
modified = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return modified;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,429 @@
|
|||
/*
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This file is available under and governed by the GNU General Public
|
||||
* License version 2 only, as published by the Free Software Foundation.
|
||||
* However, the following notice accompanied the original version of this
|
||||
* file:
|
||||
*
|
||||
* Written by Doug Lea and Josh Bloch with assistance from members of JCP
|
||||
* JSR-166 Expert Group and released to the public domain, as explained at
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||
*/
|
||||
|
||||
package org.apache.poi.util.java7_util;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.Map;
|
||||
import java.util.SortedMap;
|
||||
|
||||
/**
|
||||
* A {@link SortedMap} extended with navigation methods returning the
|
||||
* closest matches for given search targets. Methods
|
||||
* {@code lowerEntry}, {@code floorEntry}, {@code ceilingEntry},
|
||||
* and {@code higherEntry} return {@code Map.Entry} objects
|
||||
* associated with keys respectively less than, less than or equal,
|
||||
* greater than or equal, and greater than a given key, returning
|
||||
* {@code null} if there is no such key. Similarly, methods
|
||||
* {@code lowerKey}, {@code floorKey}, {@code ceilingKey}, and
|
||||
* {@code higherKey} return only the associated keys. All of these
|
||||
* methods are designed for locating, not traversing entries.
|
||||
*
|
||||
* <p>A {@code NavigableMap7} may be accessed and traversed in either
|
||||
* ascending or descending key order. The {@code descendingMap}
|
||||
* method returns a view of the map with the senses of all relational
|
||||
* and directional methods inverted. The performance of ascending
|
||||
* operations and views is likely to be faster than that of descending
|
||||
* ones. Methods {@code subMap}, {@code headMap},
|
||||
* and {@code tailMap} differ from the like-named {@code
|
||||
* SortedMap} methods in accepting additional arguments describing
|
||||
* whether lower and upper bounds are inclusive versus exclusive.
|
||||
* Submaps of any {@code NavigableMap7} must implement the {@code
|
||||
* NavigableMap7} interface.
|
||||
*
|
||||
* <p>This interface additionally defines methods {@code firstEntry},
|
||||
* {@code pollFirstEntry}, {@code lastEntry}, and
|
||||
* {@code pollLastEntry} that return and/or remove the least and
|
||||
* greatest mappings, if any exist, else returning {@code null}.
|
||||
*
|
||||
* <p>Implementations of entry-returning methods are expected to
|
||||
* return {@code Map.Entry} pairs representing snapshots of mappings
|
||||
* at the time they were produced, and thus generally do <em>not</em>
|
||||
* support the optional {@code Entry.setValue} method. Note however
|
||||
* that it is possible to change mappings in the associated map using
|
||||
* method {@code put}.
|
||||
*
|
||||
* <p>Methods
|
||||
* {@link #subMap(Object, Object) subMap(K, K)},
|
||||
* {@link #headMap(Object) headMap(K)}, and
|
||||
* {@link #tailMap(Object) tailMap(K)}
|
||||
* are specified to return {@code SortedMap} to allow existing
|
||||
* implementations of {@code SortedMap} to be compatibly retrofitted to
|
||||
* implement {@code NavigableMap7}, but extensions and implementations
|
||||
* of this interface are encouraged to override these methods to return
|
||||
* {@code NavigableMap7}. Similarly,
|
||||
* {@link #keySet()} can be overriden to return {@code NavigableSet}.
|
||||
*
|
||||
* <p>This interface is a member of the
|
||||
* <a href="{@docRoot}/../technotes/guides/collections/index.html">
|
||||
* Java Collections Framework</a>.
|
||||
*
|
||||
* @author Doug Lea
|
||||
* @author Josh Bloch
|
||||
* @param <K> the type of keys maintained by this map
|
||||
* @param <V> the type of mapped values
|
||||
* @since 1.6
|
||||
*/
|
||||
public interface NavigableMap7<K,V> extends SortedMap<K,V> {
|
||||
/**
|
||||
* Returns a key-value mapping associated with the greatest key
|
||||
* strictly less than the given key, or {@code null} if there is
|
||||
* no such key.
|
||||
*
|
||||
* @param key the key
|
||||
* @return an entry with the greatest key less than {@code key},
|
||||
* or {@code null} if there is no such key
|
||||
* @throws ClassCastException if the specified key cannot be compared
|
||||
* with the keys currently in the map
|
||||
* @throws NullPointerException if the specified key is null
|
||||
* and this map does not permit null keys
|
||||
*/
|
||||
Map.Entry<K,V> lowerEntry(K key);
|
||||
|
||||
/**
|
||||
* Returns the greatest key strictly less than the given key, or
|
||||
* {@code null} if there is no such key.
|
||||
*
|
||||
* @param key the key
|
||||
* @return the greatest key less than {@code key},
|
||||
* or {@code null} if there is no such key
|
||||
* @throws ClassCastException if the specified key cannot be compared
|
||||
* with the keys currently in the map
|
||||
* @throws NullPointerException if the specified key is null
|
||||
* and this map does not permit null keys
|
||||
*/
|
||||
K lowerKey(K key);
|
||||
|
||||
/**
|
||||
* Returns a key-value mapping associated with the greatest key
|
||||
* less than or equal to the given key, or {@code null} if there
|
||||
* is no such key.
|
||||
*
|
||||
* @param key the key
|
||||
* @return an entry with the greatest key less than or equal to
|
||||
* {@code key}, or {@code null} if there is no such key
|
||||
* @throws ClassCastException if the specified key cannot be compared
|
||||
* with the keys currently in the map
|
||||
* @throws NullPointerException if the specified key is null
|
||||
* and this map does not permit null keys
|
||||
*/
|
||||
Map.Entry<K,V> floorEntry(K key);
|
||||
|
||||
/**
|
||||
* Returns the greatest key less than or equal to the given key,
|
||||
* or {@code null} if there is no such key.
|
||||
*
|
||||
* @param key the key
|
||||
* @return the greatest key less than or equal to {@code key},
|
||||
* or {@code null} if there is no such key
|
||||
* @throws ClassCastException if the specified key cannot be compared
|
||||
* with the keys currently in the map
|
||||
* @throws NullPointerException if the specified key is null
|
||||
* and this map does not permit null keys
|
||||
*/
|
||||
K floorKey(K key);
|
||||
|
||||
/**
|
||||
* Returns a key-value mapping associated with the least key
|
||||
* greater than or equal to the given key, or {@code null} if
|
||||
* there is no such key.
|
||||
*
|
||||
* @param key the key
|
||||
* @return an entry with the least key greater than or equal to
|
||||
* {@code key}, or {@code null} if there is no such key
|
||||
* @throws ClassCastException if the specified key cannot be compared
|
||||
* with the keys currently in the map
|
||||
* @throws NullPointerException if the specified key is null
|
||||
* and this map does not permit null keys
|
||||
*/
|
||||
Map.Entry<K,V> ceilingEntry(K key);
|
||||
|
||||
/**
|
||||
* Returns the least key greater than or equal to the given key,
|
||||
* or {@code null} if there is no such key.
|
||||
*
|
||||
* @param key the key
|
||||
* @return the least key greater than or equal to {@code key},
|
||||
* or {@code null} if there is no such key
|
||||
* @throws ClassCastException if the specified key cannot be compared
|
||||
* with the keys currently in the map
|
||||
* @throws NullPointerException if the specified key is null
|
||||
* and this map does not permit null keys
|
||||
*/
|
||||
K ceilingKey(K key);
|
||||
|
||||
/**
|
||||
* Returns a key-value mapping associated with the least key
|
||||
* strictly greater than the given key, or {@code null} if there
|
||||
* is no such key.
|
||||
*
|
||||
* @param key the key
|
||||
* @return an entry with the least key greater than {@code key},
|
||||
* or {@code null} if there is no such key
|
||||
* @throws ClassCastException if the specified key cannot be compared
|
||||
* with the keys currently in the map
|
||||
* @throws NullPointerException if the specified key is null
|
||||
* and this map does not permit null keys
|
||||
*/
|
||||
Map.Entry<K,V> higherEntry(K key);
|
||||
|
||||
/**
|
||||
* Returns the least key strictly greater than the given key, or
|
||||
* {@code null} if there is no such key.
|
||||
*
|
||||
* @param key the key
|
||||
* @return the least key greater than {@code key},
|
||||
* or {@code null} if there is no such key
|
||||
* @throws ClassCastException if the specified key cannot be compared
|
||||
* with the keys currently in the map
|
||||
* @throws NullPointerException if the specified key is null
|
||||
* and this map does not permit null keys
|
||||
*/
|
||||
K higherKey(K key);
|
||||
|
||||
/**
|
||||
* Returns a key-value mapping associated with the least
|
||||
* key in this map, or {@code null} if the map is empty.
|
||||
*
|
||||
* @return an entry with the least key,
|
||||
* or {@code null} if this map is empty
|
||||
*/
|
||||
Map.Entry<K,V> firstEntry();
|
||||
|
||||
/**
|
||||
* Returns a key-value mapping associated with the greatest
|
||||
* key in this map, or {@code null} if the map is empty.
|
||||
*
|
||||
* @return an entry with the greatest key,
|
||||
* or {@code null} if this map is empty
|
||||
*/
|
||||
Map.Entry<K,V> lastEntry();
|
||||
|
||||
/**
|
||||
* Removes and returns a key-value mapping associated with
|
||||
* the least key in this map, or {@code null} if the map is empty.
|
||||
*
|
||||
* @return the removed first entry of this map,
|
||||
* or {@code null} if this map is empty
|
||||
*/
|
||||
Map.Entry<K,V> pollFirstEntry();
|
||||
|
||||
/**
|
||||
* Removes and returns a key-value mapping associated with
|
||||
* the greatest key in this map, or {@code null} if the map is empty.
|
||||
*
|
||||
* @return the removed last entry of this map,
|
||||
* or {@code null} if this map is empty
|
||||
*/
|
||||
Map.Entry<K,V> pollLastEntry();
|
||||
|
||||
/**
|
||||
* Returns a reverse order view of the mappings contained in this map.
|
||||
* The descending map is backed by this map, so changes to the map are
|
||||
* reflected in the descending map, and vice-versa. If either map is
|
||||
* modified while an iteration over a collection view of either map
|
||||
* is in progress (except through the iterator's own {@code remove}
|
||||
* operation), the results of the iteration are undefined.
|
||||
*
|
||||
* <p>The returned map has an ordering equivalent to
|
||||
* <tt>{@link Collections#reverseOrder(Comparator) Collections.reverseOrder}(comparator())</tt>.
|
||||
* The expression {@code m.descendingMap().descendingMap()} returns a
|
||||
* view of {@code m} essentially equivalent to {@code m}.
|
||||
*
|
||||
* @return a reverse order view of this map
|
||||
*/
|
||||
NavigableMap7<K,V> descendingMap();
|
||||
|
||||
/**
|
||||
* Returns a {@link NavigableSet} view of the keys contained in this map.
|
||||
* The set's iterator returns the keys in ascending order.
|
||||
* The set is backed by the map, so changes to the map are reflected in
|
||||
* the set, and vice-versa. If the map is modified while an iteration
|
||||
* over the set is in progress (except through the iterator's own {@code
|
||||
* remove} operation), the results of the iteration are undefined. The
|
||||
* set supports element removal, which removes the corresponding mapping
|
||||
* from the map, via the {@code Iterator.remove}, {@code Set.remove},
|
||||
* {@code removeAll}, {@code retainAll}, and {@code clear} operations.
|
||||
* It does not support the {@code add} or {@code addAll} operations.
|
||||
*
|
||||
* @return a navigable set view of the keys in this map
|
||||
*/
|
||||
NavigableSet7<K> navigableKeySet();
|
||||
|
||||
/**
|
||||
* Returns a reverse order {@link NavigableSet} view of the keys contained in this map.
|
||||
* The set's iterator returns the keys in descending order.
|
||||
* The set is backed by the map, so changes to the map are reflected in
|
||||
* the set, and vice-versa. If the map is modified while an iteration
|
||||
* over the set is in progress (except through the iterator's own {@code
|
||||
* remove} operation), the results of the iteration are undefined. The
|
||||
* set supports element removal, which removes the corresponding mapping
|
||||
* from the map, via the {@code Iterator.remove}, {@code Set.remove},
|
||||
* {@code removeAll}, {@code retainAll}, and {@code clear} operations.
|
||||
* It does not support the {@code add} or {@code addAll} operations.
|
||||
*
|
||||
* @return a reverse order navigable set view of the keys in this map
|
||||
*/
|
||||
NavigableSet7<K> descendingKeySet();
|
||||
|
||||
/**
|
||||
* Returns a view of the portion of this map whose keys range from
|
||||
* {@code fromKey} to {@code toKey}. If {@code fromKey} and
|
||||
* {@code toKey} are equal, the returned map is empty unless
|
||||
* {@code fromInclusive} and {@code toInclusive} are both true. The
|
||||
* returned map is backed by this map, so changes in the returned map are
|
||||
* reflected in this map, and vice-versa. The returned map supports all
|
||||
* optional map operations that this map supports.
|
||||
*
|
||||
* <p>The returned map will throw an {@code IllegalArgumentException}
|
||||
* on an attempt to insert a key outside of its range, or to construct a
|
||||
* submap either of whose endpoints lie outside its range.
|
||||
*
|
||||
* @param fromKey low endpoint of the keys in the returned map
|
||||
* @param fromInclusive {@code true} if the low endpoint
|
||||
* is to be included in the returned view
|
||||
* @param toKey high endpoint of the keys in the returned map
|
||||
* @param toInclusive {@code true} if the high endpoint
|
||||
* is to be included in the returned view
|
||||
* @return a view of the portion of this map whose keys range from
|
||||
* {@code fromKey} to {@code toKey}
|
||||
* @throws ClassCastException if {@code fromKey} and {@code toKey}
|
||||
* cannot be compared to one another using this map's comparator
|
||||
* (or, if the map has no comparator, using natural ordering).
|
||||
* Implementations may, but are not required to, throw this
|
||||
* exception if {@code fromKey} or {@code toKey}
|
||||
* cannot be compared to keys currently in the map.
|
||||
* @throws NullPointerException if {@code fromKey} or {@code toKey}
|
||||
* is null and this map does not permit null keys
|
||||
* @throws IllegalArgumentException if {@code fromKey} is greater than
|
||||
* {@code toKey}; or if this map itself has a restricted
|
||||
* range, and {@code fromKey} or {@code toKey} lies
|
||||
* outside the bounds of the range
|
||||
*/
|
||||
NavigableMap7<K,V> subMap(K fromKey, boolean fromInclusive,
|
||||
K toKey, boolean toInclusive);
|
||||
|
||||
/**
|
||||
* Returns a view of the portion of this map whose keys are less than (or
|
||||
* equal to, if {@code inclusive} is true) {@code toKey}. The returned
|
||||
* map is backed by this map, so changes in the returned map are reflected
|
||||
* in this map, and vice-versa. The returned map supports all optional
|
||||
* map operations that this map supports.
|
||||
*
|
||||
* <p>The returned map will throw an {@code IllegalArgumentException}
|
||||
* on an attempt to insert a key outside its range.
|
||||
*
|
||||
* @param toKey high endpoint of the keys in the returned map
|
||||
* @param inclusive {@code true} if the high endpoint
|
||||
* is to be included in the returned view
|
||||
* @return a view of the portion of this map whose keys are less than
|
||||
* (or equal to, if {@code inclusive} is true) {@code toKey}
|
||||
* @throws ClassCastException if {@code toKey} is not compatible
|
||||
* with this map's comparator (or, if the map has no comparator,
|
||||
* if {@code toKey} does not implement {@link Comparable}).
|
||||
* Implementations may, but are not required to, throw this
|
||||
* exception if {@code toKey} cannot be compared to keys
|
||||
* currently in the map.
|
||||
* @throws NullPointerException if {@code toKey} is null
|
||||
* and this map does not permit null keys
|
||||
* @throws IllegalArgumentException if this map itself has a
|
||||
* restricted range, and {@code toKey} lies outside the
|
||||
* bounds of the range
|
||||
*/
|
||||
NavigableMap7<K,V> headMap(K toKey, boolean inclusive);
|
||||
|
||||
/**
|
||||
* Returns a view of the portion of this map whose keys are greater than (or
|
||||
* equal to, if {@code inclusive} is true) {@code fromKey}. The returned
|
||||
* map is backed by this map, so changes in the returned map are reflected
|
||||
* in this map, and vice-versa. The returned map supports all optional
|
||||
* map operations that this map supports.
|
||||
*
|
||||
* <p>The returned map will throw an {@code IllegalArgumentException}
|
||||
* on an attempt to insert a key outside its range.
|
||||
*
|
||||
* @param fromKey low endpoint of the keys in the returned map
|
||||
* @param inclusive {@code true} if the low endpoint
|
||||
* is to be included in the returned view
|
||||
* @return a view of the portion of this map whose keys are greater than
|
||||
* (or equal to, if {@code inclusive} is true) {@code fromKey}
|
||||
* @throws ClassCastException if {@code fromKey} is not compatible
|
||||
* with this map's comparator (or, if the map has no comparator,
|
||||
* if {@code fromKey} does not implement {@link Comparable}).
|
||||
* Implementations may, but are not required to, throw this
|
||||
* exception if {@code fromKey} cannot be compared to keys
|
||||
* currently in the map.
|
||||
* @throws NullPointerException if {@code fromKey} is null
|
||||
* and this map does not permit null keys
|
||||
* @throws IllegalArgumentException if this map itself has a
|
||||
* restricted range, and {@code fromKey} lies outside the
|
||||
* bounds of the range
|
||||
*/
|
||||
NavigableMap7<K,V> tailMap(K fromKey, boolean inclusive);
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>Equivalent to {@code subMap(fromKey, true, toKey, false)}.
|
||||
*
|
||||
* @throws ClassCastException {@inheritDoc}
|
||||
* @throws NullPointerException {@inheritDoc}
|
||||
* @throws IllegalArgumentException {@inheritDoc}
|
||||
*/
|
||||
SortedMap<K,V> subMap(K fromKey, K toKey);
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>Equivalent to {@code headMap(toKey, false)}.
|
||||
*
|
||||
* @throws ClassCastException {@inheritDoc}
|
||||
* @throws NullPointerException {@inheritDoc}
|
||||
* @throws IllegalArgumentException {@inheritDoc}
|
||||
*/
|
||||
SortedMap<K,V> headMap(K toKey);
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>Equivalent to {@code tailMap(fromKey, true)}.
|
||||
*
|
||||
* @throws ClassCastException {@inheritDoc}
|
||||
* @throws NullPointerException {@inheritDoc}
|
||||
* @throws IllegalArgumentException {@inheritDoc}
|
||||
*/
|
||||
SortedMap<K,V> tailMap(K fromKey);
|
||||
}
|
|
@ -0,0 +1,324 @@
|
|||
/*
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This file is available under and governed by the GNU General Public
|
||||
* License version 2 only, as published by the Free Software Foundation.
|
||||
* However, the following notice accompanied the original version of this
|
||||
* file:
|
||||
*
|
||||
* Written by Doug Lea and Josh Bloch with assistance from members of JCP
|
||||
* JSR-166 Expert Group and released to the public domain, as explained at
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||
*/
|
||||
|
||||
package org.apache.poi.util.java7_util;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.Iterator;
|
||||
import java.util.SortedSet;
|
||||
|
||||
/**
|
||||
* A {@link SortedSet} extended with navigation methods reporting
|
||||
* closest matches for given search targets. Methods {@code lower},
|
||||
* {@code floor}, {@code ceiling}, and {@code higher} return elements
|
||||
* respectively less than, less than or equal, greater than or equal,
|
||||
* and greater than a given element, returning {@code null} if there
|
||||
* is no such element. A {@code NavigableSet7} may be accessed and
|
||||
* traversed in either ascending or descending order. The {@code
|
||||
* descendingSet} method returns a view of the set with the senses of
|
||||
* all relational and directional methods inverted. The performance of
|
||||
* ascending operations and views is likely to be faster than that of
|
||||
* descending ones. This interface additionally defines methods
|
||||
* {@code pollFirst} and {@code pollLast} that return and remove the
|
||||
* lowest and highest element, if one exists, else returning {@code
|
||||
* null}. Methods {@code subSet}, {@code headSet},
|
||||
* and {@code tailSet} differ from the like-named {@code
|
||||
* SortedSet} methods in accepting additional arguments describing
|
||||
* whether lower and upper bounds are inclusive versus exclusive.
|
||||
* Subsets of any {@code NavigableSet7} must implement the {@code
|
||||
* NavigableSet7} interface.
|
||||
*
|
||||
* <p> The return values of navigation methods may be ambiguous in
|
||||
* implementations that permit {@code null} elements. However, even
|
||||
* in this case the result can be disambiguated by checking
|
||||
* {@code contains(null)}. To avoid such issues, implementations of
|
||||
* this interface are encouraged to <em>not</em> permit insertion of
|
||||
* {@code null} elements. (Note that sorted sets of {@link
|
||||
* Comparable} elements intrinsically do not permit {@code null}.)
|
||||
*
|
||||
* <p>Methods
|
||||
* {@link #subSet(Object, Object) subSet(E, E)},
|
||||
* {@link #headSet(Object) headSet(E)}, and
|
||||
* {@link #tailSet(Object) tailSet(E)}
|
||||
* are specified to return {@code SortedSet} to allow existing
|
||||
* implementations of {@code SortedSet} to be compatibly retrofitted to
|
||||
* implement {@code NavigableSet7}, but extensions and implementations
|
||||
* of this interface are encouraged to override these methods to return
|
||||
* {@code NavigableSet7}.
|
||||
*
|
||||
* <p>This interface is a member of the
|
||||
* <a href="{@docRoot}/../technotes/guides/collections/index.html">
|
||||
* Java Collections Framework</a>.
|
||||
*
|
||||
* @author Doug Lea
|
||||
* @author Josh Bloch
|
||||
* @param <E> the type of elements maintained by this set
|
||||
* @since 1.6
|
||||
*/
|
||||
public interface NavigableSet7<E> extends SortedSet<E> {
|
||||
/**
|
||||
* Returns the greatest element in this set strictly less than the
|
||||
* given element, or {@code null} if there is no such element.
|
||||
*
|
||||
* @param e the value to match
|
||||
* @return the greatest element less than {@code e},
|
||||
* or {@code null} if there is no such element
|
||||
* @throws ClassCastException if the specified element cannot be
|
||||
* compared with the elements currently in the set
|
||||
* @throws NullPointerException if the specified element is null
|
||||
* and this set does not permit null elements
|
||||
*/
|
||||
E lower(E e);
|
||||
|
||||
/**
|
||||
* Returns the greatest element in this set less than or equal to
|
||||
* the given element, or {@code null} if there is no such element.
|
||||
*
|
||||
* @param e the value to match
|
||||
* @return the greatest element less than or equal to {@code e},
|
||||
* or {@code null} if there is no such element
|
||||
* @throws ClassCastException if the specified element cannot be
|
||||
* compared with the elements currently in the set
|
||||
* @throws NullPointerException if the specified element is null
|
||||
* and this set does not permit null elements
|
||||
*/
|
||||
E floor(E e);
|
||||
|
||||
/**
|
||||
* Returns the least element in this set greater than or equal to
|
||||
* the given element, or {@code null} if there is no such element.
|
||||
*
|
||||
* @param e the value to match
|
||||
* @return the least element greater than or equal to {@code e},
|
||||
* or {@code null} if there is no such element
|
||||
* @throws ClassCastException if the specified element cannot be
|
||||
* compared with the elements currently in the set
|
||||
* @throws NullPointerException if the specified element is null
|
||||
* and this set does not permit null elements
|
||||
*/
|
||||
E ceiling(E e);
|
||||
|
||||
/**
|
||||
* Returns the least element in this set strictly greater than the
|
||||
* given element, or {@code null} if there is no such element.
|
||||
*
|
||||
* @param e the value to match
|
||||
* @return the least element greater than {@code e},
|
||||
* or {@code null} if there is no such element
|
||||
* @throws ClassCastException if the specified element cannot be
|
||||
* compared with the elements currently in the set
|
||||
* @throws NullPointerException if the specified element is null
|
||||
* and this set does not permit null elements
|
||||
*/
|
||||
E higher(E e);
|
||||
|
||||
/**
|
||||
* Retrieves and removes the first (lowest) element,
|
||||
* or returns {@code null} if this set is empty.
|
||||
*
|
||||
* @return the first element, or {@code null} if this set is empty
|
||||
*/
|
||||
E pollFirst();
|
||||
|
||||
/**
|
||||
* Retrieves and removes the last (highest) element,
|
||||
* or returns {@code null} if this set is empty.
|
||||
*
|
||||
* @return the last element, or {@code null} if this set is empty
|
||||
*/
|
||||
E pollLast();
|
||||
|
||||
/**
|
||||
* Returns an iterator over the elements in this set, in ascending order.
|
||||
*
|
||||
* @return an iterator over the elements in this set, in ascending order
|
||||
*/
|
||||
Iterator<E> iterator();
|
||||
|
||||
/**
|
||||
* Returns a reverse order view of the elements contained in this set.
|
||||
* The descending set is backed by this set, so changes to the set are
|
||||
* reflected in the descending set, and vice-versa. If either set is
|
||||
* modified while an iteration over either set is in progress (except
|
||||
* through the iterator's own {@code remove} operation), the results of
|
||||
* the iteration are undefined.
|
||||
*
|
||||
* <p>The returned set has an ordering equivalent to
|
||||
* <tt>{@link Collections#reverseOrder(Comparator) Collections.reverseOrder}(comparator())</tt>.
|
||||
* The expression {@code s.descendingSet().descendingSet()} returns a
|
||||
* view of {@code s} essentially equivalent to {@code s}.
|
||||
*
|
||||
* @return a reverse order view of this set
|
||||
*/
|
||||
NavigableSet7<E> descendingSet();
|
||||
|
||||
/**
|
||||
* Returns an iterator over the elements in this set, in descending order.
|
||||
* Equivalent in effect to {@code descendingSet().iterator()}.
|
||||
*
|
||||
* @return an iterator over the elements in this set, in descending order
|
||||
*/
|
||||
Iterator<E> descendingIterator();
|
||||
|
||||
/**
|
||||
* Returns a view of the portion of this set whose elements range from
|
||||
* {@code fromElement} to {@code toElement}. If {@code fromElement} and
|
||||
* {@code toElement} are equal, the returned set is empty unless {@code
|
||||
* fromInclusive} and {@code toInclusive} are both true. The returned set
|
||||
* is backed by this set, so changes in the returned set are reflected in
|
||||
* this set, and vice-versa. The returned set supports all optional set
|
||||
* operations that this set supports.
|
||||
*
|
||||
* <p>The returned set will throw an {@code IllegalArgumentException}
|
||||
* on an attempt to insert an element outside its range.
|
||||
*
|
||||
* @param fromElement low endpoint of the returned set
|
||||
* @param fromInclusive {@code true} if the low endpoint
|
||||
* is to be included in the returned view
|
||||
* @param toElement high endpoint of the returned set
|
||||
* @param toInclusive {@code true} if the high endpoint
|
||||
* is to be included in the returned view
|
||||
* @return a view of the portion of this set whose elements range from
|
||||
* {@code fromElement}, inclusive, to {@code toElement}, exclusive
|
||||
* @throws ClassCastException if {@code fromElement} and
|
||||
* {@code toElement} cannot be compared to one another using this
|
||||
* set's comparator (or, if the set has no comparator, using
|
||||
* natural ordering). Implementations may, but are not required
|
||||
* to, throw this exception if {@code fromElement} or
|
||||
* {@code toElement} cannot be compared to elements currently in
|
||||
* the set.
|
||||
* @throws NullPointerException if {@code fromElement} or
|
||||
* {@code toElement} is null and this set does
|
||||
* not permit null elements
|
||||
* @throws IllegalArgumentException if {@code fromElement} is
|
||||
* greater than {@code toElement}; or if this set itself
|
||||
* has a restricted range, and {@code fromElement} or
|
||||
* {@code toElement} lies outside the bounds of the range.
|
||||
*/
|
||||
NavigableSet7<E> subSet(E fromElement, boolean fromInclusive,
|
||||
E toElement, boolean toInclusive);
|
||||
|
||||
/**
|
||||
* Returns a view of the portion of this set whose elements are less than
|
||||
* (or equal to, if {@code inclusive} is true) {@code toElement}. The
|
||||
* returned set is backed by this set, so changes in the returned set are
|
||||
* reflected in this set, and vice-versa. The returned set supports all
|
||||
* optional set operations that this set supports.
|
||||
*
|
||||
* <p>The returned set will throw an {@code IllegalArgumentException}
|
||||
* on an attempt to insert an element outside its range.
|
||||
*
|
||||
* @param toElement high endpoint of the returned set
|
||||
* @param inclusive {@code true} if the high endpoint
|
||||
* is to be included in the returned view
|
||||
* @return a view of the portion of this set whose elements are less than
|
||||
* (or equal to, if {@code inclusive} is true) {@code toElement}
|
||||
* @throws ClassCastException if {@code toElement} is not compatible
|
||||
* with this set's comparator (or, if the set has no comparator,
|
||||
* if {@code toElement} does not implement {@link Comparable}).
|
||||
* Implementations may, but are not required to, throw this
|
||||
* exception if {@code toElement} cannot be compared to elements
|
||||
* currently in the set.
|
||||
* @throws NullPointerException if {@code toElement} is null and
|
||||
* this set does not permit null elements
|
||||
* @throws IllegalArgumentException if this set itself has a
|
||||
* restricted range, and {@code toElement} lies outside the
|
||||
* bounds of the range
|
||||
*/
|
||||
NavigableSet7<E> headSet(E toElement, boolean inclusive);
|
||||
|
||||
/**
|
||||
* Returns a view of the portion of this set whose elements are greater
|
||||
* than (or equal to, if {@code inclusive} is true) {@code fromElement}.
|
||||
* The returned set is backed by this set, so changes in the returned set
|
||||
* are reflected in this set, and vice-versa. The returned set supports
|
||||
* all optional set operations that this set supports.
|
||||
*
|
||||
* <p>The returned set will throw an {@code IllegalArgumentException}
|
||||
* on an attempt to insert an element outside its range.
|
||||
*
|
||||
* @param fromElement low endpoint of the returned set
|
||||
* @param inclusive {@code true} if the low endpoint
|
||||
* is to be included in the returned view
|
||||
* @return a view of the portion of this set whose elements are greater
|
||||
* than or equal to {@code fromElement}
|
||||
* @throws ClassCastException if {@code fromElement} is not compatible
|
||||
* with this set's comparator (or, if the set has no comparator,
|
||||
* if {@code fromElement} does not implement {@link Comparable}).
|
||||
* Implementations may, but are not required to, throw this
|
||||
* exception if {@code fromElement} cannot be compared to elements
|
||||
* currently in the set.
|
||||
* @throws NullPointerException if {@code fromElement} is null
|
||||
* and this set does not permit null elements
|
||||
* @throws IllegalArgumentException if this set itself has a
|
||||
* restricted range, and {@code fromElement} lies outside the
|
||||
* bounds of the range
|
||||
*/
|
||||
NavigableSet7<E> tailSet(E fromElement, boolean inclusive);
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>Equivalent to {@code subSet(fromElement, true, toElement, false)}.
|
||||
*
|
||||
* @throws ClassCastException {@inheritDoc}
|
||||
* @throws NullPointerException {@inheritDoc}
|
||||
* @throws IllegalArgumentException {@inheritDoc}
|
||||
*/
|
||||
SortedSet<E> subSet(E fromElement, E toElement);
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>Equivalent to {@code headSet(toElement, false)}.
|
||||
*
|
||||
* @throws ClassCastException {@inheritDoc}
|
||||
* @throws NullPointerException {@inheritDoc}
|
||||
* @throws IllegalArgumentException {@inheritDoc}
|
||||
na */
|
||||
SortedSet<E> headSet(E toElement);
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>Equivalent to {@code tailSet(fromElement, true)}.
|
||||
*
|
||||
* @throws ClassCastException {@inheritDoc}
|
||||
* @throws NullPointerException {@inheritDoc}
|
||||
* @throws IllegalArgumentException {@inheritDoc}
|
||||
*/
|
||||
SortedSet<E> tailSet(E fromElement);
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,554 @@
|
|||
/*
|
||||
* Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package org.apache.poi.util.java7_util;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.ConcurrentModificationException;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import java.util.NoSuchElementException;
|
||||
import java.util.Set;
|
||||
import java.util.SortedSet;
|
||||
import java.util.TreeMap;
|
||||
|
||||
/**
|
||||
* A {@link NavigableSet7} implementation based on a {@link TreeMap}.
|
||||
* The elements are ordered using their {@linkplain Comparable natural
|
||||
* ordering}, or by a {@link Comparator} provided at set creation
|
||||
* time, depending on which constructor is used.
|
||||
*
|
||||
* <p>This implementation provides guaranteed log(n) time cost for the basic
|
||||
* operations ({@code add}, {@code remove} and {@code contains}).
|
||||
*
|
||||
* <p>Note that the ordering maintained by a set (whether or not an explicit
|
||||
* comparator is provided) must be <i>consistent with equals</i> if it is to
|
||||
* correctly implement the {@code Set} interface. (See {@code Comparable}
|
||||
* or {@code Comparator} for a precise definition of <i>consistent with
|
||||
* equals</i>.) This is so because the {@code Set} interface is defined in
|
||||
* terms of the {@code equals} operation, but a {@code TreeSet7} instance
|
||||
* performs all element comparisons using its {@code compareTo} (or
|
||||
* {@code compare}) method, so two elements that are deemed equal by this method
|
||||
* are, from the standpoint of the set, equal. The behavior of a set
|
||||
* <i>is</i> well-defined even if its ordering is inconsistent with equals; it
|
||||
* just fails to obey the general contract of the {@code Set} interface.
|
||||
*
|
||||
* <p><strong>Note that this implementation is not synchronized.</strong>
|
||||
* If multiple threads access a tree set concurrently, and at least one
|
||||
* of the threads modifies the set, it <i>must</i> be synchronized
|
||||
* externally. This is typically accomplished by synchronizing on some
|
||||
* object that naturally encapsulates the set.
|
||||
* If no such object exists, the set should be "wrapped" using the
|
||||
* {@link Collections#synchronizedSortedSet Collections.synchronizedSortedSet}
|
||||
* method. This is best done at creation time, to prevent accidental
|
||||
* unsynchronized access to the set: <pre>
|
||||
* SortedSet s = Collections.synchronizedSortedSet(new TreeSet7(...));</pre>
|
||||
*
|
||||
* <p>The iterators returned by this class's {@code iterator} method are
|
||||
* <i>fail-fast</i>: if the set is modified at any time after the iterator is
|
||||
* created, in any way except through the iterator's own {@code remove}
|
||||
* method, the iterator will throw a {@link ConcurrentModificationException}.
|
||||
* Thus, in the face of concurrent modification, the iterator fails quickly
|
||||
* and cleanly, rather than risking arbitrary, non-deterministic behavior at
|
||||
* an undetermined time in the future.
|
||||
*
|
||||
* <p>Note that the fail-fast behavior of an iterator cannot be guaranteed
|
||||
* as it is, generally speaking, impossible to make any hard guarantees in the
|
||||
* presence of unsynchronized concurrent modification. Fail-fast iterators
|
||||
* throw {@code ConcurrentModificationException} on a best-effort basis.
|
||||
* Therefore, it would be wrong to write a program that depended on this
|
||||
* exception for its correctness: <i>the fail-fast behavior of iterators
|
||||
* should be used only to detect bugs.</i>
|
||||
*
|
||||
* <p>This class is a member of the
|
||||
* <a href="{@docRoot}/../technotes/guides/collections/index.html">
|
||||
* Java Collections Framework</a>.
|
||||
*
|
||||
* @param <E> the type of elements maintained by this set
|
||||
*
|
||||
* @author Josh Bloch
|
||||
* @see Collection
|
||||
* @see Set
|
||||
* @see HashSet
|
||||
* @see Comparable
|
||||
* @see Comparator
|
||||
* @see TreeMap
|
||||
* @since 1.2
|
||||
*/
|
||||
|
||||
public class TreeSet7<E> extends AbstractSet7<E>
|
||||
implements NavigableSet7<E>, Cloneable, java.io.Serializable
|
||||
{
|
||||
/**
|
||||
* The backing map.
|
||||
*/
|
||||
private transient NavigableMap7<E,Object> m;
|
||||
|
||||
// Dummy value to associate with an Object in the backing Map
|
||||
private static final Object PRESENT = new Object();
|
||||
|
||||
/**
|
||||
* Constructs a set backed by the specified navigable map.
|
||||
*/
|
||||
TreeSet7(NavigableMap7<E,Object> m) {
|
||||
this.m = m;
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a new, empty tree set, sorted according to the
|
||||
* natural ordering of its elements. All elements inserted into
|
||||
* the set must implement the {@link Comparable} interface.
|
||||
* Furthermore, all such elements must be <i>mutually
|
||||
* comparable</i>: {@code e1.compareTo(e2)} must not throw a
|
||||
* {@code ClassCastException} for any elements {@code e1} and
|
||||
* {@code e2} in the set. If the user attempts to add an element
|
||||
* to the set that violates this constraint (for example, the user
|
||||
* attempts to add a string element to a set whose elements are
|
||||
* integers), the {@code add} call will throw a
|
||||
* {@code ClassCastException}.
|
||||
*/
|
||||
public TreeSet7() {
|
||||
this(new TreeMap7<E,Object>());
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a new, empty tree set, sorted according to the specified
|
||||
* comparator. All elements inserted into the set must be <i>mutually
|
||||
* comparable</i> by the specified comparator: {@code comparator.compare(e1,
|
||||
* e2)} must not throw a {@code ClassCastException} for any elements
|
||||
* {@code e1} and {@code e2} in the set. If the user attempts to add
|
||||
* an element to the set that violates this constraint, the
|
||||
* {@code add} call will throw a {@code ClassCastException}.
|
||||
*
|
||||
* @param comparator the comparator that will be used to order this set.
|
||||
* If {@code null}, the {@linkplain Comparable natural
|
||||
* ordering} of the elements will be used.
|
||||
*/
|
||||
public TreeSet7(Comparator<? super E> comparator) {
|
||||
this(new TreeMap7<E,Object>(comparator));
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a new tree set containing the elements in the specified
|
||||
* collection, sorted according to the <i>natural ordering</i> of its
|
||||
* elements. All elements inserted into the set must implement the
|
||||
* {@link Comparable} interface. Furthermore, all such elements must be
|
||||
* <i>mutually comparable</i>: {@code e1.compareTo(e2)} must not throw a
|
||||
* {@code ClassCastException} for any elements {@code e1} and
|
||||
* {@code e2} in the set.
|
||||
*
|
||||
* @param c collection whose elements will comprise the new set
|
||||
* @throws ClassCastException if the elements in {@code c} are
|
||||
* not {@link Comparable}, or are not mutually comparable
|
||||
* @throws NullPointerException if the specified collection is null
|
||||
*/
|
||||
public TreeSet7(Collection<? extends E> c) {
|
||||
this();
|
||||
addAll(c);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a new tree set containing the same elements and
|
||||
* using the same ordering as the specified sorted set.
|
||||
*
|
||||
* @param s sorted set whose elements will comprise the new set
|
||||
* @throws NullPointerException if the specified sorted set is null
|
||||
*/
|
||||
public TreeSet7(SortedSet<E> s) {
|
||||
this(s.comparator());
|
||||
addAll(s);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an iterator over the elements in this set in ascending order.
|
||||
*
|
||||
* @return an iterator over the elements in this set in ascending order
|
||||
*/
|
||||
public Iterator<E> iterator() {
|
||||
return m.navigableKeySet().iterator();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an iterator over the elements in this set in descending order.
|
||||
*
|
||||
* @return an iterator over the elements in this set in descending order
|
||||
* @since 1.6
|
||||
*/
|
||||
public Iterator<E> descendingIterator() {
|
||||
return m.descendingKeySet().iterator();
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 1.6
|
||||
*/
|
||||
public NavigableSet7<E> descendingSet() {
|
||||
return new TreeSet7<E>(m.descendingMap());
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the number of elements in this set (its cardinality).
|
||||
*
|
||||
* @return the number of elements in this set (its cardinality)
|
||||
*/
|
||||
public int size() {
|
||||
return m.size();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns {@code true} if this set contains no elements.
|
||||
*
|
||||
* @return {@code true} if this set contains no elements
|
||||
*/
|
||||
public boolean isEmpty() {
|
||||
return m.isEmpty();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns {@code true} if this set contains the specified element.
|
||||
* More formally, returns {@code true} if and only if this set
|
||||
* contains an element {@code e} such that
|
||||
* <tt>(o==null ? e==null : o.equals(e))</tt>.
|
||||
*
|
||||
* @param o object to be checked for containment in this set
|
||||
* @return {@code true} if this set contains the specified element
|
||||
* @throws ClassCastException if the specified object cannot be compared
|
||||
* with the elements currently in the set
|
||||
* @throws NullPointerException if the specified element is null
|
||||
* and this set uses natural ordering, or its comparator
|
||||
* does not permit null elements
|
||||
*/
|
||||
public boolean contains(Object o) {
|
||||
return m.containsKey(o);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the specified element to this set if it is not already present.
|
||||
* More formally, adds the specified element {@code e} to this set if
|
||||
* the set contains no element {@code e2} such that
|
||||
* <tt>(e==null ? e2==null : e.equals(e2))</tt>.
|
||||
* If this set already contains the element, the call leaves the set
|
||||
* unchanged and returns {@code false}.
|
||||
*
|
||||
* @param e element to be added to this set
|
||||
* @return {@code true} if this set did not already contain the specified
|
||||
* element
|
||||
* @throws ClassCastException if the specified object cannot be compared
|
||||
* with the elements currently in this set
|
||||
* @throws NullPointerException if the specified element is null
|
||||
* and this set uses natural ordering, or its comparator
|
||||
* does not permit null elements
|
||||
*/
|
||||
public boolean add(E e) {
|
||||
return m.put(e, PRESENT)==null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the specified element from this set if it is present.
|
||||
* More formally, removes an element {@code e} such that
|
||||
* <tt>(o==null ? e==null : o.equals(e))</tt>,
|
||||
* if this set contains such an element. Returns {@code true} if
|
||||
* this set contained the element (or equivalently, if this set
|
||||
* changed as a result of the call). (This set will not contain the
|
||||
* element once the call returns.)
|
||||
*
|
||||
* @param o object to be removed from this set, if present
|
||||
* @return {@code true} if this set contained the specified element
|
||||
* @throws ClassCastException if the specified object cannot be compared
|
||||
* with the elements currently in this set
|
||||
* @throws NullPointerException if the specified element is null
|
||||
* and this set uses natural ordering, or its comparator
|
||||
* does not permit null elements
|
||||
*/
|
||||
public boolean remove(Object o) {
|
||||
return m.remove(o)==PRESENT;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes all of the elements from this set.
|
||||
* The set will be empty after this call returns.
|
||||
*/
|
||||
public void clear() {
|
||||
m.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds all of the elements in the specified collection to this set.
|
||||
*
|
||||
* @param c collection containing elements to be added to this set
|
||||
* @return {@code true} if this set changed as a result of the call
|
||||
* @throws ClassCastException if the elements provided cannot be compared
|
||||
* with the elements currently in the set
|
||||
* @throws NullPointerException if the specified collection is null or
|
||||
* if any element is null and this set uses natural ordering, or
|
||||
* its comparator does not permit null elements
|
||||
*/
|
||||
public boolean addAll(Collection<? extends E> c) {
|
||||
// Use linear-time version if applicable
|
||||
if (m.size()==0 && c.size() > 0 &&
|
||||
c instanceof SortedSet &&
|
||||
m instanceof TreeMap7) {
|
||||
SortedSet<? extends E> set = (SortedSet<? extends E>) c;
|
||||
TreeMap7<E,Object> map = (TreeMap7<E, Object>) m;
|
||||
@SuppressWarnings("unchecked")
|
||||
Comparator<? super E> cc = (Comparator<? super E>) set.comparator();
|
||||
Comparator<? super E> mc = map.comparator();
|
||||
if (cc==mc || (cc != null && cc.equals(mc))) {
|
||||
map.addAllForTreeSet(set, PRESENT);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return super.addAll(c);
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws ClassCastException {@inheritDoc}
|
||||
* @throws NullPointerException if {@code fromElement} or {@code toElement}
|
||||
* is null and this set uses natural ordering, or its comparator
|
||||
* does not permit null elements
|
||||
* @throws IllegalArgumentException {@inheritDoc}
|
||||
* @since 1.6
|
||||
*/
|
||||
public NavigableSet7<E> subSet(E fromElement, boolean fromInclusive,
|
||||
E toElement, boolean toInclusive) {
|
||||
return new TreeSet7<E>(m.subMap(fromElement, fromInclusive,
|
||||
toElement, toInclusive));
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws ClassCastException {@inheritDoc}
|
||||
* @throws NullPointerException if {@code toElement} is null and
|
||||
* this set uses natural ordering, or its comparator does
|
||||
* not permit null elements
|
||||
* @throws IllegalArgumentException {@inheritDoc}
|
||||
* @since 1.6
|
||||
*/
|
||||
public NavigableSet7<E> headSet(E toElement, boolean inclusive) {
|
||||
return new TreeSet7<E>(m.headMap(toElement, inclusive));
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws ClassCastException {@inheritDoc}
|
||||
* @throws NullPointerException if {@code fromElement} is null and
|
||||
* this set uses natural ordering, or its comparator does
|
||||
* not permit null elements
|
||||
* @throws IllegalArgumentException {@inheritDoc}
|
||||
* @since 1.6
|
||||
*/
|
||||
public NavigableSet7<E> tailSet(E fromElement, boolean inclusive) {
|
||||
return new TreeSet7<E>(m.tailMap(fromElement, inclusive));
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws ClassCastException {@inheritDoc}
|
||||
* @throws NullPointerException if {@code fromElement} or
|
||||
* {@code toElement} is null and this set uses natural ordering,
|
||||
* or its comparator does not permit null elements
|
||||
* @throws IllegalArgumentException {@inheritDoc}
|
||||
*/
|
||||
public SortedSet<E> subSet(E fromElement, E toElement) {
|
||||
return subSet(fromElement, true, toElement, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws ClassCastException {@inheritDoc}
|
||||
* @throws NullPointerException if {@code toElement} is null
|
||||
* and this set uses natural ordering, or its comparator does
|
||||
* not permit null elements
|
||||
* @throws IllegalArgumentException {@inheritDoc}
|
||||
*/
|
||||
public SortedSet<E> headSet(E toElement) {
|
||||
return headSet(toElement, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws ClassCastException {@inheritDoc}
|
||||
* @throws NullPointerException if {@code fromElement} is null
|
||||
* and this set uses natural ordering, or its comparator does
|
||||
* not permit null elements
|
||||
* @throws IllegalArgumentException {@inheritDoc}
|
||||
*/
|
||||
public SortedSet<E> tailSet(E fromElement) {
|
||||
return tailSet(fromElement, true);
|
||||
}
|
||||
|
||||
public Comparator<? super E> comparator() {
|
||||
return m.comparator();
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws NoSuchElementException {@inheritDoc}
|
||||
*/
|
||||
public E first() {
|
||||
return m.firstKey();
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws NoSuchElementException {@inheritDoc}
|
||||
*/
|
||||
public E last() {
|
||||
return m.lastKey();
|
||||
}
|
||||
|
||||
// NavigableSet API methods
|
||||
|
||||
/**
|
||||
* @throws ClassCastException {@inheritDoc}
|
||||
* @throws NullPointerException if the specified element is null
|
||||
* and this set uses natural ordering, or its comparator
|
||||
* does not permit null elements
|
||||
* @since 1.6
|
||||
*/
|
||||
public E lower(E e) {
|
||||
return m.lowerKey(e);
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws ClassCastException {@inheritDoc}
|
||||
* @throws NullPointerException if the specified element is null
|
||||
* and this set uses natural ordering, or its comparator
|
||||
* does not permit null elements
|
||||
* @since 1.6
|
||||
*/
|
||||
public E floor(E e) {
|
||||
return m.floorKey(e);
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws ClassCastException {@inheritDoc}
|
||||
* @throws NullPointerException if the specified element is null
|
||||
* and this set uses natural ordering, or its comparator
|
||||
* does not permit null elements
|
||||
* @since 1.6
|
||||
*/
|
||||
public E ceiling(E e) {
|
||||
return m.ceilingKey(e);
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws ClassCastException {@inheritDoc}
|
||||
* @throws NullPointerException if the specified element is null
|
||||
* and this set uses natural ordering, or its comparator
|
||||
* does not permit null elements
|
||||
* @since 1.6
|
||||
*/
|
||||
public E higher(E e) {
|
||||
return m.higherKey(e);
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 1.6
|
||||
*/
|
||||
public E pollFirst() {
|
||||
Map.Entry<E,?> e = m.pollFirstEntry();
|
||||
return (e == null) ? null : e.getKey();
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 1.6
|
||||
*/
|
||||
public E pollLast() {
|
||||
Map.Entry<E,?> e = m.pollLastEntry();
|
||||
return (e == null) ? null : e.getKey();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a shallow copy of this {@code TreeSet7} instance. (The elements
|
||||
* themselves are not cloned.)
|
||||
*
|
||||
* @return a shallow copy of this set
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public Object clone() {
|
||||
TreeSet7<E> clone = null;
|
||||
try {
|
||||
clone = (TreeSet7<E>) super.clone();
|
||||
} catch (CloneNotSupportedException e) {
|
||||
throw new InternalError();
|
||||
}
|
||||
|
||||
clone.m = new TreeMap7<E,Object>(m);
|
||||
return clone;
|
||||
}
|
||||
|
||||
/**
|
||||
* Save the state of the {@code TreeSet7} instance to a stream (that is,
|
||||
* serialize it).
|
||||
*
|
||||
* @serialData Emits the comparator used to order this set, or
|
||||
* {@code null} if it obeys its elements' natural ordering
|
||||
* (Object), followed by the size of the set (the number of
|
||||
* elements it contains) (int), followed by all of its
|
||||
* elements (each an Object) in order (as determined by the
|
||||
* set's Comparator, or by the elements' natural ordering if
|
||||
* the set has no Comparator).
|
||||
*/
|
||||
private void writeObject(java.io.ObjectOutputStream s)
|
||||
throws java.io.IOException {
|
||||
// Write out any hidden stuff
|
||||
s.defaultWriteObject();
|
||||
|
||||
// Write out Comparator
|
||||
s.writeObject(m.comparator());
|
||||
|
||||
// Write out size
|
||||
s.writeInt(m.size());
|
||||
|
||||
// Write out all elements in the proper order.
|
||||
for (E e : m.keySet())
|
||||
s.writeObject(e);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reconstitute the {@code TreeSet7} instance from a stream (that is,
|
||||
* deserialize it).
|
||||
*/
|
||||
private void readObject(java.io.ObjectInputStream s)
|
||||
throws java.io.IOException, ClassNotFoundException {
|
||||
// Read in any hidden stuff
|
||||
s.defaultReadObject();
|
||||
|
||||
// Read in Comparator
|
||||
@SuppressWarnings("unchecked")
|
||||
Comparator<? super E> c = (Comparator<? super E>) s.readObject();
|
||||
|
||||
// Create backing TreeMap
|
||||
TreeMap7<E,Object> tm;
|
||||
if (c==null)
|
||||
tm = new TreeMap7<E,Object>();
|
||||
else
|
||||
tm = new TreeMap7<E,Object>(c);
|
||||
m = tm;
|
||||
|
||||
// Read in size
|
||||
int size = s.readInt();
|
||||
|
||||
tm.readTreeSet(size, s, PRESENT);
|
||||
}
|
||||
|
||||
private static final long serialVersionUID = -2479143000061671589L;
|
||||
}
|
|
@ -25,9 +25,9 @@ import java.util.Iterator;
|
|||
import java.util.List;
|
||||
import java.util.ListIterator;
|
||||
import java.util.Set;
|
||||
import java.util.TreeSet;
|
||||
|
||||
import org.apache.poi.ss.usermodel.CellStyle;
|
||||
import org.apache.poi.util.java7_util.TreeSet7;
|
||||
import org.apache.poi.xssf.util.CTColComparator;
|
||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCol;
|
||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCols;
|
||||
|
@ -95,7 +95,7 @@ public class ColumnHelper {
|
|||
*/
|
||||
private void sweepCleanColumns(CTCols cols, CTCol[] flattenedColsArray, CTCol overrideColumn) {
|
||||
List<CTCol> flattenedCols = new ArrayList<CTCol>(Arrays.asList(flattenedColsArray));
|
||||
TreeSet<CTCol> currentElements = new TreeSet<CTCol>(new CTColByMaxComparator());
|
||||
TreeSet7<CTCol> currentElements = new TreeSet7<CTCol>(new CTColByMaxComparator());
|
||||
ListIterator<CTCol> flIter = flattenedCols.listIterator();
|
||||
CTCol haveOverrideColumn = null;
|
||||
long lastMaxIndex = 0;
|
||||
|
|
Loading…
Reference in New Issue