これは最近プロジェクトで私を迷惑にしていました。私のGoogleのphooは適切な答えを見つけるのに失敗しています。ListIteratorを使用し、ユニークなリストであるコレクション
コレクションには、ListIterator
へのアクセス権がありますが、コレクション内の一意の値のみが許可されていますか?
これを推論すると、このコレクションには各要素の1つしか存在しないアイテムのコレクションがあります。私はまた、両方向でこのコレクションを横断できるようにしたい。しかし、これは遠い
public class UniqueArrayList<E> extends ArrayList<E> {
@Override
public boolean add(E element){
if (this.contains(element))
return false;
else
return super.add(element);
}
@Override
public void add(int index, E element){
if (this.contains(element))
return;
else
super.add(index, element);
}
@Override
public boolean addAll(Collection<? extends E> c){
if (new HashSet<E>(c).size() < c.size())
return false;
for(E element : c){
if (this.contains(c))
return false;
}
return super.addAll(c);
}
@Override
public boolean addAll(int index, Collection<? extends E> c) {
if (new HashSet<E>(c).size() < c.size())
return false;
for(E element : c){
if (this.contains(c))
return false;
}
return super.addAll(index, c);
}
@Override
public ListIterator<E> listIterator(int index) {
if (index < 0 || index > this.size())
throw new IndexOutOfBoundsException("Index: "+index);
return new ListItr(index);
}
@Override
public ListIterator<E> listIterator() {
return new ListItr(0);
}
@Override
public Iterator<E> iterator() {
return new Itr();
}
private class Itr implements Iterator<E> {
int cursor; // index of next element to return
int lastRet = -1; // index of last element returned; -1 if no such
int expectedModCount = modCount;
public boolean hasNext() {
return cursor != size();
}
@SuppressWarnings("unchecked")
public E next() {
checkForComodification();
int i = cursor;
if (i >= size())
throw new NoSuchElementException();
Object[] elementData = UniqueArrayList.this.toArray();
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i];
}
public void remove() {
if (lastRet < 0)
throw new IllegalStateException();
checkForComodification();
try {
UniqueArrayList.this.remove(lastRet);
cursor = lastRet;
lastRet = -1;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
}
private class ListItr extends Itr implements ListIterator<E> {
ListItr(int index) {
super();
cursor = index;
}
public boolean hasPrevious() {
return cursor != 0;
}
public int nextIndex() {
return cursor;
}
public int previousIndex() {
return cursor - 1;
}
@SuppressWarnings("unchecked")
public E previous() {
checkForComodification();
int i = cursor - 1;
if (i < 0)
throw new NoSuchElementException();
Object[] elementData = UniqueArrayList.this.toArray();
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i;
return (E) elementData[lastRet = i];
}
public void set(E e) {
if (lastRet < 0)
throw new IllegalStateException();
checkForComodification();
try {
//Need to allow this for the collections sort to work!
//if (!UniqueArrayList.this.contains(e))
UniqueArrayList.this.set(lastRet, e);
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}
public void add(E e) {
checkForComodification();
try {
int i = cursor;
UniqueArrayList.this.add(i, e);
cursor = i + 1;
lastRet = -1;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}
}
}
:と私は、ソートされたか、私は、私は、適切なものを発見し、次のコードを使用して独自のクラスを記述しなければならなかったいませんでしたCollections.Sort();
を使用して、それを並べ替えることができるようにすることのいずれかにそれをしたいです完璧から、Collections.sort();
はリスト内の項目を移動するためにListIterator.set();
を上書きすることはできません。一意でないアイテムがここにリストに追加されないようにしようとすると、ソートは決して起こりません。
誰かがより良い方法を持っているか、私が望む規則に従う別のコレクションを知っていますか?あるいは、ちょっと面倒な問題で生きていく必要がありますか?
[編集] これはCollections.sort();
方法である:
public static <T extends Comparable<? super T>> void sort(List<T> list) {
Object[] a = list.toArray();
Arrays.sort(a);
ListIterator<T> i = list.listIterator();
for (int j=0; j<a.length; j++) {
i.next();
i.set((T)a[j]);
}
}
彼らはこれを行うために与える推論は次のとおりです。
この実装は、配列に指定されたリストをダンプ 配列をソートします配列内の対応する位置の から各要素をリセットするリストを反復処理します。これにより、リンクされた リストをソートしようとしたときに発生するlog(n)パフォーマンスが、nのようになりません。
は、Javaのバージョンを使用していますか? – Kayaman
'Collections.sort();で' ListIterator.set(); 'が使われているという考えはどこで思いつきましたか? – Kayaman
Java 1.7で、ソート方法 – Draken