package cn.agrael.collection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List
* 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。
* <p>
* 该 {@link List} 保证不会出现重复的元素,除此之外,该 {@link List} 的特性和 {@link ArrayList} 相同。
*
*
*
* @param <E>
* 此 collection 中保持的元素类型。
*
* @see ArrayList
*/
public class NotRepeatedList<E> extends ArrayList<E> implements List<E> {
/** 版本号 */
private static final long serialVersionUID = 1269085290242775328L;
/**
* 构造一个初始容量为 10 的空列表。
*/
public NotRepeatedList() {
super();
}
/**
* 构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection
* 的迭代器返回它们的顺序排列的,如果有重复的,则只取第一个。。
*
* @param c
* 其元素将放置在此列表中的 collection 。
* @throws NullPointerException
* - 如果指定的 collection 为 null。
*/
public NotRepeatedList(Collection<? extends E> c) {
addAll(c);
}
/**
* 构造一个具有指定初始容量的空列表。
*
* @param initialCapacity
* initialCapacity - 列表的初始容量。
* @throws IllegalArgumentException
* - 如果指定的初始容量为负。
*/
public NotRepeatedList(int initialCapacity) {
super(initialCapacity);
}
/**
* 追加元素(如果不存在)。
*
* @param o
* 要添加到此 Collection 中的元素(如果不存在)。
* @return 如果此 list 随调用的结果而发生改变,则返回 true
*/
@Override
public boolean add(E o) {
if (!contains(o)) {
return super.add(o);
}
return false;
};
/**
* 在此列表中指定位置上插入指定元素(如果不存在)。移位当前在该位置上的元素(如果有),所有后续元素都向右移(其索引加 1)。
*
* @param index
* 要插入指定元素的索引。
* @param 要插入的元素
* 。
* @throws 如果索引超出了范围
* (index < 0 || index > size())。
*/
@Override
public void add(int index, E element) {
if (!contains(element)) {
super.add(index, element);
}
};
/**
* 按照指定 Collection 的迭代器所返回的元素顺序,将该 Collection
* 中的所有元素追加到此列表的尾部(其中的元素不存在的才会插入)。如果正在进行此操作时修改指定的
* Collection,那么此操作的行为是不明确的。(这意味着如果指定的 Collection
* 是此列表且此列表是非空的,那么此调用的行为是不明确的。)
*
* @param c
* 要插入到此列表中的元素。
* @return 如果此列表随调用的结果而发生改变,则返回 true。
* @throws NullPointerException
* 如果指定的 collection 为 null。
*/
@Override
public boolean addAll(Collection<? extends E> c) {
int number = size();
ensureCapacity(size() + c.size());
for (E e : c) {
add(e);
}
return number == size() ? false : true;
}
/**
* 从指定的位置开始,将指定 Collection
* 中的所有元素插入到此列表中(其中的元素不存在的才会插入)。向右移动当前位于该位置的元素(如果有)以及所有后续元素(增加其索引)。新元素将按照指定
* Collection 的迭代器所返回的元素顺序出现在列表中。
*
* @param index
* 插入指定 collection 中的首个元素的位置索引。
* @param c
* 要插入此列表中的元素。
* @return 如果此列表随调用的结果而发生改变,则返回 true。
* @throws IndexOutOfBoundsException
* 如果索引超出范围 (index < 0 || index > size())。
* @throws NullPointerException
* 如果指定的 Collection 为 null。
*/
@Override
public boolean addAll(int index, Collection<? extends E> c) {
int number = size();
ensureCapacity(size() + c.size());
int i = index;
for (E e : c) {
if (!contains(e)) {
super.add(i, e);
i++;
}
}
return number == size() ? false : true;
}
/**
* 用指定的元素替代此列表中指定位置上的元素(如果不存在)。
*
* @param index 要替代的元素的索引。
* @param element 存储在指定位置上的元素。
* @return 以前位于该指定位置上的元素。
* @throws 如果索引超出范围 (index < 0 || index >= size())。
*/
@Override
public E set(int index, E element) {
if (! contains(element)) {
return super.set(index, element);
}
return null;
}
}
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List
* 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。
* <p>
* 该 {@link List} 保证不会出现重复的元素,除此之外,该 {@link List} 的特性和 {@link ArrayList} 相同。
*
*
*
* @param <E>
* 此 collection 中保持的元素类型。
*
* @see ArrayList
*/
public class NotRepeatedList<E> extends ArrayList<E> implements List<E> {
/** 版本号 */
private static final long serialVersionUID = 1269085290242775328L;
/**
* 构造一个初始容量为 10 的空列表。
*/
public NotRepeatedList() {
super();
}
/**
* 构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection
* 的迭代器返回它们的顺序排列的,如果有重复的,则只取第一个。。
*
* @param c
* 其元素将放置在此列表中的 collection 。
* @throws NullPointerException
* - 如果指定的 collection 为 null。
*/
public NotRepeatedList(Collection<? extends E> c) {
addAll(c);
}
/**
* 构造一个具有指定初始容量的空列表。
*
* @param initialCapacity
* initialCapacity - 列表的初始容量。
* @throws IllegalArgumentException
* - 如果指定的初始容量为负。
*/
public NotRepeatedList(int initialCapacity) {
super(initialCapacity);
}
/**
* 追加元素(如果不存在)。
*
* @param o
* 要添加到此 Collection 中的元素(如果不存在)。
* @return 如果此 list 随调用的结果而发生改变,则返回 true
*/
@Override
public boolean add(E o) {
if (!contains(o)) {
return super.add(o);
}
return false;
};
/**
* 在此列表中指定位置上插入指定元素(如果不存在)。移位当前在该位置上的元素(如果有),所有后续元素都向右移(其索引加 1)。
*
* @param index
* 要插入指定元素的索引。
* @param 要插入的元素
* 。
* @throws 如果索引超出了范围
* (index < 0 || index > size())。
*/
@Override
public void add(int index, E element) {
if (!contains(element)) {
super.add(index, element);
}
};
/**
* 按照指定 Collection 的迭代器所返回的元素顺序,将该 Collection
* 中的所有元素追加到此列表的尾部(其中的元素不存在的才会插入)。如果正在进行此操作时修改指定的
* Collection,那么此操作的行为是不明确的。(这意味着如果指定的 Collection
* 是此列表且此列表是非空的,那么此调用的行为是不明确的。)
*
* @param c
* 要插入到此列表中的元素。
* @return 如果此列表随调用的结果而发生改变,则返回 true。
* @throws NullPointerException
* 如果指定的 collection 为 null。
*/
@Override
public boolean addAll(Collection<? extends E> c) {
int number = size();
ensureCapacity(size() + c.size());
for (E e : c) {
add(e);
}
return number == size() ? false : true;
}
/**
* 从指定的位置开始,将指定 Collection
* 中的所有元素插入到此列表中(其中的元素不存在的才会插入)。向右移动当前位于该位置的元素(如果有)以及所有后续元素(增加其索引)。新元素将按照指定
* Collection 的迭代器所返回的元素顺序出现在列表中。
*
* @param index
* 插入指定 collection 中的首个元素的位置索引。
* @param c
* 要插入此列表中的元素。
* @return 如果此列表随调用的结果而发生改变,则返回 true。
* @throws IndexOutOfBoundsException
* 如果索引超出范围 (index < 0 || index > size())。
* @throws NullPointerException
* 如果指定的 Collection 为 null。
*/
@Override
public boolean addAll(int index, Collection<? extends E> c) {
int number = size();
ensureCapacity(size() + c.size());
int i = index;
for (E e : c) {
if (!contains(e)) {
super.add(i, e);
i++;
}
}
return number == size() ? false : true;
}
/**
* 用指定的元素替代此列表中指定位置上的元素(如果不存在)。
*
* @param index 要替代的元素的索引。
* @param element 存储在指定位置上的元素。
* @return 以前位于该指定位置上的元素。
* @throws 如果索引超出范围 (index < 0 || index >= size())。
*/
@Override
public E set(int index, E element) {
if (! contains(element)) {
return super.set(index, element);
}
return null;
}
}