com.xenoamess.commons.primitive.collections.lists.CharList Maven / Gradle / Ivy
Show all versions of commonx Show documentation
/*
* Copyright (c) 1997, 2018, 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 com.xenoamess.commons.primitive.collections.lists;
import com.xenoamess.commons.primitive.Primitive;
import com.xenoamess.commons.primitive.collections.CharCollection;
import com.xenoamess.commons.primitive.comparators.CharComparator;
import com.xenoamess.commons.primitive.functions.CharUnaryOperator;
import com.xenoamess.commons.primitive.iterators.CharListIterator;
import com.xenoamess.commons.primitive.iterators.CharRandomAccessSpliterator;
import com.xenoamess.commons.primitive.iterators.CharSpliterator;
import com.xenoamess.commons.primitive.iterators.CharSpliterators;
import com.xenoamess.commonx.java.util.Arraysx;
import java.util.*;
import java.util.function.UnaryOperator;
/**
* An ordered collection (also known as a sequence). The user of this
* interface has precise control over where in the list each element is
* inserted. The user can access elements by their integer index (position in
* the list), and search for elements in the list.
*
* Unlike sets, lists typically allow duplicate elements. More formally,
* lists typically allow pairs of elements {@code e1} and {@code e2}
* such that {@code e1.equals(e2)}, and they typically allow multiple
* null elements if they allow null elements at all. It is not inconceivable
* that someone might wish to implement a list that prohibits duplicates, by
* throwing runtime exceptions when the user attempts to insert them, but we
* expect this usage to be rare.
*
* The {@code List} interface places additional stipulations, beyond those
* specified in the {@code Collection} interface, on the contracts of the
* {@code iterator}, {@code add}, {@code remove}, {@code equals}, and
* {@code hashCode} methods. Declarations for other inherited methods are
* also included here for convenience.
*
* The {@code List} interface provides four methods for positional (indexed)
* access to list elements. Lists (like Java arrays) are zero based. Note
* that these operations may execute in time proportional to the index value
* for some implementations (the {@code CharLinkedList} class, for
* example). Thus, iterating over the elements in a list is typically
* preferable to indexing through it if the caller does not know the
* implementation.
*
* The {@code List} interface provides a special iterator, called a
* {@code ListIterator}, that allows element insertion and replacement, and
* bidirectional access in addition to the normal operations that the
* {@code Iterator} interface provides. A method is provided to obtain a
* list iterator that starts at a specified position in the list.
*
* The {@code List} interface provides two methods to search for a specified
* object. From a performance standpoint, these methods should be used with
* caution. In many implementations they will perform costly linear
* searches.
*
* The {@code List} interface provides two methods to efficiently insert and
* remove multiple elements at an arbitrary point in the list.
*
* Note: While it is permissible for lists to contain themselves as elements,
* extreme caution is advised: the {@code equals} and {@code hashCode}
* methods are no longer well defined on such a list.
*
*
Some list implementations have restrictions on the elements that
* they may contain. For example, some implementations prohibit null elements,
* and some have restrictions on the types of their elements. Attempting to
* add an ineligible element throws an unchecked exception, typically
* {@code NullPointerException} or {@code ClassCastException}. Attempting
* to query the presence of an ineligible element may throw an exception,
* or it may simply return false; some implementations will exhibit the former
* behavior and some will exhibit the latter. More generally, attempting an
* operation on an ineligible element whose completion would not result in
* the insertion of an ineligible element into the list may throw an
* exception or it may succeed, at the option of the implementation.
* Such exceptions are marked as "optional" in the specification for this
* interface.
*
*
Unmodifiable Lists
* The {@link java.util.List#of(Object...) List.of} and
* {@link java.util.List#copyOf List.copyOf} static factory methods
* provide a convenient way to create unmodifiable lists. The {@code List}
* instances created by these methods have the following characteristics:
*
*
* - They are unmodifiable. Elements cannot
* be added, removed, or replaced. Calling any mutator method on the List
* will always cause {@code UnsupportedOperationException} to be thrown.
* However, if the contained elements are themselves mutable,
* this may cause the List's contents to appear to change.
*
- They disallow {@code null} elements. Attempts to create them with
* {@code null} elements result in {@code NullPointerException}.
*
- They are serializable if all elements are serializable.
*
- The order of elements in the list is the same as the order of the
* provided arguments, or of the elements in the provided array.
*
- They are value-based.
* Callers should make no assumptions about the identity of the returned instances.
* Factories are free to create new instances or reuse existing ones. Therefore,
* identity-sensitive operations on these instances (reference equality ({@code ==}),
* identity hash code, and synchronization) are unreliable and should be avoided.
*
- They are serialized as specified on the
* Serialized Form
* page.
*
*
* This interface is a member of the
*
* Java Collections Framework.
*
* @author Josh Bloch
* @author Neal Gafter
* @author XenoAmess
* @version 0.8.0
* @see Collection
* @see Set
* @see ArrayList
* @see LinkedList
* @see Vector
* @see Arrays#asList(Object[])
* @see Collections#nCopies(int, Object)
* @see Collections#EMPTY_LIST
* @see AbstractList
* @see AbstractCharSequentialList
* @see List
* @since 1.2
*/
public interface CharList extends List, CharCollection, Primitive {
/**
* Returns an array containing all of the elements in this list in proper
* sequence (from first to last element).
*
* The returned array will be "safe" in that no references to it are
* maintained by this list. (In other words, this method must
* allocate a new array even if this list is backed by an array).
* The caller is thus free to modify the returned array.
*
*
This method acts as bridge between array-based and collection-based
* APIs.
*
* @return an array containing all of the elements in this list in proper
* sequence
* @see Arrays#asList(Object[])
*/
@Override
char[] toArrayPrimitive();
/**
* {@inheritDoc}
*
* Returns {@code true} if this list contains the specified element.
* More formally, returns {@code true} if and only if this list contains
* at least one element {@code e} such that
* {@code Objects.equals(o, e)}.
*/
@Override
default boolean contains(Object o) {
return CharCollection.super.contains(o);
}
/**
* {@inheritDoc}
*
* Removes a single instance of the specified element from this
* collection, if it is present (optional operation). More formally,
* removes an element {@code e} such that
* {@code Objects.equals(o, e)}, if
* this collection contains one or more such elements. Returns
* {@code true} if this collection contained the specified element (or
* equivalently, if this collection changed as a result of the call).
*/
@Override
default boolean remove(Object o) {
return CharCollection.super.remove(o);
}
/**
* {@inheritDoc}
*
* Ensures that this collection contains the specified element (optional
* operation). Returns {@code true} if this collection changed as a
* result of the call. (Returns {@code false} if this collection does
* not permit duplicates and already contains the specified element.)
*
* Collections that support this operation may place limitations on what
* elements may be added to this collection. In particular, some
* collections will refuse to add {@code null} elements, and others will
* impose restrictions on the type of elements that may be added.
* Collection classes should clearly specify in their documentation any
* restrictions on what elements may be added.
*
* If a collection refuses to add a particular element for any reason
* other than that it already contains the element, it must throw
* an exception (rather than returning {@code false}). This preserves
* the invariant that a collection always contains the specified element
* after this call returns.
*/
@Override
default boolean add(Character e) {
return CharCollection.super.add(e);
}
// Modification Operations
// /**
// * Appends the specified element to the end of this list (optional
// * operation).
// *
// *
Lists that support this operation may place limitations on what
// * elements may be added to this list. In particular, some
// * lists will refuse to add null elements, and others will impose
// * restrictions on the type of elements that may be added. List
// * classes should clearly specify in their documentation any restrictions
// * on what elements may be added.
// *
// * @param e element to be appended to this list
// * @return {@code true} (as specified by {@link Collection#add})
// * @throws UnsupportedOperationException if the {@code add} operation
// * is not supported by this list
// * @throws ClassCastException if the class of the specified element
// * prevents it from being added to this list
// * @throws NullPointerException if the specified element is null and this
// * list does not permit null elements
// * @throws IllegalArgumentException if some property of this element
// * prevents it from being added to this list
// */
// @Override
// default boolean add(Character e) {
// return this.addPrimitive(e);
// }
//
// /**
// * Primitive replacement of add(Character e)
// *
// * @param e element to be appended to this list
// * @return {@code true} (as specified by {@link Collection#add})
// * @throws UnsupportedOperationException if the {@code add} operation
// * is not supported by this list
// * @throws ClassCastException if the class of the specified element
// * prevents it from being added to this list
// * @throws NullPointerException if the specified element is null and this
// * list does not permit null elements
// * @throws IllegalArgumentException if some property of this element
// * prevents it from being added to this list
// * @implSpec This implementation calls {@code add(size(), e)}.
// *
// *
Note that this implementation throws an
// * {@code UnsupportedOperationException} unless
// * {@link #add(int, Object) add(int, E)} is overridden.
// * @see #add(Character e)
// */
// @Override
// default boolean add(char e) {
// return this.addPrimitive(e);
// }
//
// /**
// * Primitive replacement of add(Character e)
// *
// * @param e element to be appended to this list
// * @return {@code true} (as specified by {@link Collection#add})
// * @throws UnsupportedOperationException if the {@code add} operation
// * is not supported by this list
// * @throws ClassCastException if the class of the specified element
// * prevents it from being added to this list
// * @throws NullPointerException if the specified element is null and this
// * list does not permit null elements
// * @throws IllegalArgumentException if some property of this element
// * prevents it from being added to this list
// * @implSpec This implementation calls {@code add(size(), e)}.
// *
// *
Note that this implementation throws an
// * {@code UnsupportedOperationException} unless
// * {@link #add(int, Object) add(int, E)} is overridden.
// * @see #add(Character e)
// */
// @Override
// boolean addPrimitive(char e);
// /**
//// * Removes the first occurrence of the specified element from this list,
//// * if it is present (optional operation). If this list does not contain
//// * the element, it is unchanged. More formally, removes the element with
//// * the lowest index {@code i} such that
//// * {@code Objects.equals(o, get(i))}
//// * (if such an element exists). Returns {@code true} if this list
//// * contained the specified element (or equivalently, if this list changed
//// * as a result of the call).
//// *
//// * @param o element to be removed from this list, if present
//// * @return {@code true} if this list contained the specified element
//// * @throws ClassCastException if the type of the specified element
//// * is incompatible with this list
//// * (optional)
//// * @throws NullPointerException if the specified element is null and this
//// * list does not permit null elements
//// * (optional)
//// * @throws UnsupportedOperationException if the {@code remove} operation
//// * is not supported by this list
//// */
//// @Override
//// default boolean remove(Object o) {
//// if (o == null) {
//// return false;
//// }
//// if (!(o instanceof Character)) {
//// return false;
//// }
//// return this.removePrimitive((Character) o);
//// }
////
//// /**
//// * Primitive replacement of {@code remove(Object o)}
//// *
//// * @param o element to be removed from this list, if present
//// * @return {@code true} if this list contained the specified element
//// * @throws ClassCastException if the type of the specified element
//// * is incompatible with this list
//// * (optional)
//// * @throws NullPointerException if the specified element is null and this
//// * list does not permit null elements
//// * (optional)
//// * @throws UnsupportedOperationException if the {@code remove} operation
//// * is not supported by this list
//// * @see #remove(Object o)
//// */
//// @Override
//// default boolean remove(char o) {
//// return this.removePrimitive(o);
//// }
////
//// /**
//// * Primitive replacement of {@code remove(Object o)}
//// *
//// * @param o element to be removed from this list, if present
//// * @return {@code true} if this list contained the specified element
//// * @throws ClassCastException if the type of the specified element
//// * is incompatible with this list
//// * (optional)
//// * @throws NullPointerException if the specified element is null and this
//// * list does not permit null elements
//// * (optional)
//// * @throws UnsupportedOperationException if the {@code remove} operation
//// * is not supported by this list
//// * @see #remove(Object o)
//// */
//// @Override
//// boolean removePrimitive(char o);
// Bulk Modification Operations
// /**
// * Returns {@code true} if this list contains all of the elements of the
// * specified collection.
// *
// * @param c collection to be checked for containment in this list
// * @return {@code true} if this list contains all of the elements of the
// * specified collection
// * @throws ClassCastException if the types of one or more elements
// * in the specified collection are incompatible with this
// * list
// * (optional)
// * @throws NullPointerException if the specified collection contains one
// * or more null elements and this list does not permit null
// * elements
// * (optional),
// * or if the specified collection is null
// * @see #contains(Object)
// */
// @Override
// boolean containsAll(Collection> c);
// /**
// * Appends all of the elements in the specified collection to the end of
// * this list, in the order that they are returned by the specified
// * collection's iterator (optional operation). The behavior of this
// * operation is undefined if the specified collection is modified while
// * the operation is in progress. (Note that this will occur if the
// * specified collection is this list, and it's nonempty.)
// *
// * @param c collection containing elements to be added to this list
// * @return {@code true} if this list changed as a result of the call
// * @throws UnsupportedOperationException if the {@code addAll} operation
// * is not supported by this list
// * @throws ClassCastException if the class of an element of the specified
// * collection prevents it from being added to this list
// * @throws NullPointerException if the specified collection contains one
// * or more null elements and this list does not permit null
// * elements, or if the specified collection is null
// * @throws IllegalArgumentException if some property of an element of the
// * specified collection prevents it from being added to this list
// * @see #add(Object)
// */
// boolean addAll(Collection extends Character> c);
//
// /**
// * Inserts all of the elements in the specified collection into this
// * list at the specified position (optional operation). Shifts the
// * element currently at that position (if any) and any subsequent
// * elements to the right (increases their indices). The new elements
// * will appear in this list in the order that they are returned by the
// * specified collection's iterator. The behavior of this operation is
// * undefined if the specified collection is modified while the
// * operation is in progress. (Note that this will occur if the specified
// * collection is this list, and it's nonempty.)
// *
// * @param index index at which to insert the first element from the
// * specified collection
// * @param c collection containing elements to be added to this list
// * @return {@code true} if this list changed as a result of the call
// * @throws UnsupportedOperationException if the {@code addAll} operation
// * is not supported by this list
// * @throws ClassCastException if the class of an element of the specified
// * collection prevents it from being added to this list
// * @throws NullPointerException if the specified collection contains one
// * or more null elements and this list does not permit null
// * elements, or if the specified collection is null
// * @throws IllegalArgumentException if some property of an element of the
// * specified collection prevents it from being added to this list
// * @throws IndexOutOfBoundsException if the index is out of range
// * ({@code index < 0 || index > size()})
// */
// boolean addAll(int index, Collection extends E> c);
//
// /**
// * Removes from this list all of its elements that are contained in the
// * specified collection (optional operation).
// *
// * @param c collection containing elements to be removed from this list
// * @return {@code true} if this list changed as a result of the call
// * @throws UnsupportedOperationException if the {@code removeAll} operation
// * is not supported by this list
// * @throws ClassCastException if the class of an element of this list
// * is incompatible with the specified collection
// * (optional)
// * @throws NullPointerException if this list contains a null element and the
// * specified collection does not permit null elements
// * (optional),
// * or if the specified collection is null
// * @see #remove(Object)
// * @see #contains(Object)
// */
// boolean removeAll(Collection> c);
//
// /**
// * Retains only the elements in this list that are contained in the
// * specified collection (optional operation). In other words, removes
// * from this list all of its elements that are not contained in the
// * specified collection.
// *
// * @param c collection containing elements to be retained in this list
// * @return {@code true} if this list changed as a result of the call
// * @throws UnsupportedOperationException if the {@code retainAll} operation
// * is not supported by this list
// * @throws ClassCastException if the class of an element of this list
// * is incompatible with the specified collection
// * (optional)
// * @throws NullPointerException if this list contains a null element and the
// * specified collection does not permit null elements
// * (optional),
// * or if the specified collection is null
// * @see #remove(Object)
// * @see #contains(Object)
// */
// boolean retainAll(Collection> c);
/**
* {@inheritDoc}
*
* Replaces each element of this list with the result of applying the
* operator to that element. Errors or runtime exceptions thrown by
* the operator are relayed to the caller.
*
* @implSpec The default implementation is equivalent to, for this {@code list}:
*
{@code
* final ListIterator li = list.listIterator();
* while (li.hasNext()) {
* li.set(operator.apply(li.next()));
* }
* }
*
* If the list's list-iterator does not support the {@code set} operation
* then an {@code UnsupportedOperationException} will be thrown when
* replacing the first element.
* @since 1.8
*/
@Override
default void replaceAll(UnaryOperator operator) {
Objects.requireNonNull(operator);
final CharListIterator li = this.listIterator();
if (operator instanceof CharUnaryOperator) {
CharUnaryOperator operatorCharUnaryOperator = (CharUnaryOperator) operator;
while (li.hasNext()) {
li.setPrimitive(operatorCharUnaryOperator.applyPrimitive(li.nextPrimitive()));
}
} else {
while (li.hasNext()) {
li.set(operator.apply(li.next()));
}
}
}
/**
* {@inheritDoc}
*
* Sorts this list according to the order induced by the specified
* {@link Comparator}. The sort is stable: this method must not
* reorder equal elements.
*
*
All elements in this list must be mutually comparable using the
* specified comparator (that is, {@code c.compare(e1, e2)} must not throw
* a {@code ClassCastException} for any elements {@code e1} and {@code e2}
* in the list).
*
*
If the specified comparator is {@code null} then all elements in this
* list must implement the {@link Comparable} interface and the elements'
* {@linkplain Comparable natural ordering} should be used.
*
*
This list must be modifiable, but need not be resizable.
*
* @implSpec The default implementation obtains an array containing all elements in
* this list, sorts the array, and iterates over this list resetting each
* element from the corresponding position in the array. (This avoids the
* n2 log(n) performance that would result from attempting
* to sort a linked list in place.)
* @implNote This implementation is a stable, adaptive, iterative mergesort that
* requires far fewer than n lg(n) comparisons when the input array is
* partially sorted, while offering the performance of a traditional
* mergesort when the input array is randomly ordered. If the input array
* is nearly sorted, the implementation requires approximately n
* comparisons. Temporary storage requirements vary from a small constant
* for nearly sorted input arrays to n/2 object references for randomly
* ordered input arrays.
*
*
The implementation takes equal advantage of ascending and
* descending order in its input array, and can take advantage of
* ascending and descending order in different parts of the same
* input array. It is well-suited to merging two or more sorted arrays:
* simply concatenate the arrays and sort the resulting array.
*
*
The implementation was adapted from Tim Peters's list sort for Python
* (
* TimSort). It uses techniques from Peter McIlroy's "Optimistic
* Sorting and Information Theoretic Complexity", in Proceedings of the
* Fourth Annual ACM-SIAM Symposium on Discrete Algorithms, pp 467-474,
* January 1993.
* @since 1.8
*/
@Override
@SuppressWarnings({"unchecked", "rawtypes"})
default void sort(Comparator super Character> c) {
if (c instanceof CharComparator) {
char[] a = this.toArrayPrimitive();
Arraysx.sort(a, 0, a.length, (CharComparator) c);
CharListIterator i = this.listIterator();
for (char e : a) {
i.nextPrimitive();
i.setPrimitive(e);
}
} else {
Object[] a = this.toArray();
Arrays.sort(a, (Comparator) c);
CharListIterator i = this.listIterator();
for (Object e : a) {
i.nextPrimitive();
i.set((Character) e);
}
}
}
// Positional Access Operations
/**
* {@inheritDoc}
*
* Returns the element at the specified position in this list.
*/
@Override
default Character get(int index) {
return this.getPrimitive(index);
}
/**
* Primitive replacement of get(int index)
*
* @param index index of the element to return
* @return the element at the specified position in this list
* @throws java.lang.IndexOutOfBoundsException if the index is out of range
* ({@code index < 0 || index >= size()})
* @see #get(int index)
*/
char getPrimitive(int index);
/**
* {@inheritDoc}
*
* Replaces the element at the specified position in this list with the
* specified element (optional operation).
*/
@Override
default Character set(int index, Character element) {
return this.setPrimitive(index, element);
}
/**
* Primitive replacement of set(int index, Character element)
*
* @param index index of the element to replace
* @param element element to be stored at the specified position
* @return the element previously at the specified position
* @throws java.lang.UnsupportedOperationException if the {@code set} operation
* is not supported by this list
* @throws java.lang.ClassCastException if the class of the specified element
* prevents it from being added to this list
* @throws java.lang.NullPointerException if the specified element is null and
* this list does not permit null elements
* @throws java.lang.IllegalArgumentException if some property of the specified
* element prevents it from being added to this list
* @throws java.lang.IndexOutOfBoundsException if the index is out of range
* ({@code index < 0 || index >= size()})
* @see #set(int index, Character element)
*/
default char set(int index, char element) {
return this.setPrimitive(index, element);
}
/**
* Primitive replacement of set(int index, Character element)
*
* @param index index of the element to replace
* @param element element to be stored at the specified position
* @return the element previously at the specified position
* @throws java.lang.UnsupportedOperationException if the {@code set} operation
* is not supported by this list
* @throws java.lang.ClassCastException if the class of the specified element
* prevents it from being added to this list
* @throws java.lang.NullPointerException if the specified element is null and
* this list does not permit null elements
* @throws java.lang.IllegalArgumentException if some property of the specified
* element prevents it from being added to this list
* @throws java.lang.IndexOutOfBoundsException if the index is out of range
* ({@code index < 0 || index >= size()})
* @see #set(int index, Character element)
*/
char setPrimitive(int index, char element);
/**
* {@inheritDoc}
*
* Inserts the specified element at the specified position in this list
* (optional operation). Shifts the element currently at that position
* (if any) and any subsequent elements to the right (adds one to their
* indices).
*/
@Override
default void add(int index, Character element) {
this.addPrimitive(index, element);
}
/**
* Primitive replacement of add(int index, Character element)
*
* @param index index at which the specified element is to be inserted
* @param element element to be inserted
* @throws java.lang.UnsupportedOperationException if the {@code add} operation
* is not supported by this list
* @throws java.lang.ClassCastException if the class of the specified element
* prevents it from being added to this list
* @throws java.lang.NullPointerException if the specified element is null and
* this list does not permit null elements
* @throws java.lang.IllegalArgumentException if some property of the specified
* element prevents it from being added to this list
* @throws java.lang.IndexOutOfBoundsException if the index is out of range
* ({@code index < 0 || index > size()})
* @see #add(int index, Character element)
*/
default void add(int index, char element) {
this.addPrimitive(index, element);
}
/**
* Primitive replacement of add(int index, Character element)
*
* @param index index at which the specified element is to be inserted
* @param element element to be inserted
* @throws java.lang.UnsupportedOperationException if the {@code add} operation
* is not supported by this list
* @throws java.lang.ClassCastException if the class of the specified element
* prevents it from being added to this list
* @throws java.lang.NullPointerException if the specified element is null and
* this list does not permit null elements
* @throws java.lang.IllegalArgumentException if some property of the specified
* element prevents it from being added to this list
* @throws java.lang.IndexOutOfBoundsException if the index is out of range
* ({@code index < 0 || index > size()})
* @see #add(int index, Character element)
*/
void addPrimitive(int index, char element);
/**
* {@inheritDoc}
*
* Removes the element at the specified position in this list (optional
* operation). Shifts any subsequent elements to the left (subtracts one
* from their indices). Returns the element that was removed from the
* list.
*/
@Override
default Character remove(int index) {
return this.removeByIndexPrimitive(index);
}
/**
* Primitive replacement of remove(int index)
*
* @param index the index of the element to be removed
* @return the element previously at the specified position
* @throws java.lang.UnsupportedOperationException if the {@code remove} operation
* is not supported by this list
* @throws java.lang.IndexOutOfBoundsException if the index is out of range
* ({@code index < 0 || index >= size()})
* @see #remove(int index)
*/
char removeByIndexPrimitive(int index);
// Search Operations
/**
* {@inheritDoc}
*
* Returns the index of the first occurrence of the specified element
* in this list, or -1 if this list does not contain the element.
* More formally, returns the lowest index {@code i} such that
* {@code Objects.equals(o, get(i))},
* or -1 if there is no such index.
*/
@Override
default int indexOf(Object o) {
if (o == null) {
return -1;
}
if (!(o instanceof Character)) {
return -1;
}
return this.indexOfPrimitive((Character) o);
}
/**
* {@inheritDoc}
*
* Returns the index of the first occurrence of the specified element
* in this list, or -1 if this list does not contain the element.
* More formally, returns the lowest index {@code i} such that
* {@code Objects.equals(o, get(i))},
* or -1 if there is no such index.
*/
default int indexOf(char o) {
return this.indexOfPrimitive(o);
}
/**
* Primitive replacement of indexOf(Object o)
*
* @param o element to search for
* @return the index of the first occurrence of the specified element in
* this list, or -1 if this list does not contain the element
* @throws java.lang.ClassCastException if the type of the specified element
* is incompatible with this list
* (optional)
* @throws java.lang.NullPointerException if the specified element is null and this
* list does not permit null elements
* (optional)
* @see #indexOf(Object o)
*/
int indexOfPrimitive(char o);
/**
* {@inheritDoc}
*
* Returns the index of the last occurrence of the specified element
* in this list, or -1 if this list does not contain the element.
* More formally, returns the highest index {@code i} such that
* {@code Objects.equals(o, get(i))},
* or -1 if there is no such index.
*/
@Override
default int lastIndexOf(Object o) {
if (o == null) {
return -1;
}
if (!(o instanceof Character)) {
return -1;
}
return this.lastIndexOfPrimitive((Character) o);
}
/**
* Primitive replacement of lastIndexOf(Object o)
*
* @param o element to search for
* @return the index of the last occurrence of the specified element in
* this list, or -1 if this list does not contain the element
* @throws java.lang.ClassCastException if the type of the specified element
* is incompatible with this list
* (optional)
* @throws java.lang.NullPointerException if the specified element is null and this
* list does not permit null elements
* (optional)
* @see #lastIndexOf(Object o)
*/
default int lastIndexOf(char o) {
return this.lastIndexOfPrimitive(o);
}
/**
* Primitive replacement of lastIndexOf(Object o)
*
* @param o element to search for
* @return the index of the last occurrence of the specified element in
* this list, or -1 if this list does not contain the element
* @throws java.lang.ClassCastException if the type of the specified element
* is incompatible with this list
* (optional)
* @throws java.lang.NullPointerException if the specified element is null and this
* list does not permit null elements
* (optional)
* @see #lastIndexOf(Object o)
*/
int lastIndexOfPrimitive(char o);
// List Iterators
/**
* {@inheritDoc}
*
* Returns a list iterator over the elements in this list (in proper
* sequence).
*/
@Override
CharListIterator listIterator();
/**
* {@inheritDoc}
*
* Returns a list iterator over the elements in this list (in proper
* sequence), starting at the specified position in the list.
* The specified index indicates the first element that would be
* returned by an initial call to {@link ListIterator#next next}.
* An initial call to {@link ListIterator#previous previous} would
* return the element with the specified index minus one.
*/
@Override
CharListIterator listIterator(int index);
// View
/**
* {@inheritDoc}
*
* Returns a view of the portion of this list between the specified
* {@code fromIndex}, inclusive, and {@code toIndex}, exclusive. (If
* {@code fromIndex} and {@code toIndex} are equal, the returned list is
* empty.) The returned list is backed by this list, so non-structural
* changes in the returned list are reflected in this list, and vice-versa.
* The returned list supports all of the optional list operations supported
* by this list.
*
* This method eliminates the need for explicit range operations (of
* the sort that commonly exist for arrays). Any operation that expects
* a list can be used as a range operation by passing a subList view
* instead of a whole list. For example, the following idiom
* removes a range of elements from a list:
*
{@code
* list.subList(from, to).clear();
* }
* Similar idioms may be constructed for {@code indexOf} and
* {@code lastIndexOf}, and all of the algorithms in the
* {@code Collections} class can be applied to a subList.
*
* The semantics of the list returned by this method become undefined if
* the backing list (i.e., this list) is structurally modified in
* any way other than via the returned list. (Structural modifications are
* those that change the size of this list, or otherwise perturb it in such
* a fashion that iterations in progress may yield incorrect results.)
*/
@Override
CharList subList(int fromIndex, int toIndex);
/**
* {@inheritDoc}
*
* Creates a {@link Spliterator} over the elements in this list.
*
*
The {@code Spliterator} reports {@link Spliterator#SIZED} and
* {@link Spliterator#ORDERED}. Implementations should document the
* reporting of additional characteristic values.
*
* @implSpec The default implementation creates a
* late-binding
* spliterator as follows:
*
* - If the list is an instance of {@link java.util.RandomAccess} then the default
* implementation creates a spliterator that traverses elements by
* invoking the method {@link java.util.List#get}. If such invocation results or
* would result in an {@code IndexOutOfBoundsException} then the
* spliterator will fail-fast and throw a
* {@code ConcurrentModificationException}.
* If the list is also an instance of {@link java.util.AbstractList} then the
* spliterator will use the list's modCount
* field to provide additional fail-fast behavior.
*
- Otherwise, the default implementation creates a spliterator from the
* list's {@code Iterator}. The spliterator inherits the
* fail-fast of the list's iterator.
*
* @implNote The created {@code Spliterator} additionally reports
* {@link java.util.Spliterator#SUBSIZED}.
* @since 1.8
*/
@Override
default CharSpliterator spliterator() {
if (this instanceof RandomAccess) {
return new CharRandomAccessSpliterator(this);
} else {
return CharSpliterators.spliterator(this, Spliterator.ORDERED);
}
}
}