はありません-重複したリストの実行あるのですか?
-
06-07-2019 - |
質問
知って SortedSet
, が、私の場合は必要なものを実装する List
, な Set
.である実装であり、このAPIにいたのか、他の場所にいたのか
べきではないハードを自分自身がきっかけになるかもしれないとのない方はこちら。
解決
ありませんJavaコレクションの標準図書館関係ではないかと思います。 LinkedHashSet<E>
保存秩序のように List
, ものだとあなたを包み込む設定 List
したいときに利用で List
しておりません意味しています。
これは、 コモンズ集 ( commons-collections4
, の一般版) List
なんて: SetUniqueList
/ SetUniqueList<E>
.
他のヒント
ここには何かを持って来て作業します。
と仮定してい ArrayList
にした新しい LinkedHashMap
.
LinkedHashSet<E> hashSet = new LinkedHashSet<E>()
そのために追加新要素の LinkedHashSet
.の追加方法を変えない LinkedHasSet
やはfalseを返す場合は新しい要素が重複す.ことが条件で試験を追加する前に、 ArrayList
.
if (hashSet.add(E)) arrayList.add(E);
このシンプルでエレガント防止への重複に追加されないように配列一覧です。いままで封止では、オーバーライドの追加方法でクラスを拡張し ArrayList
.とを覚えておいてくださいへの対応 addAll
によるループを通じて、要素の追加方法です。
このなかにあります。ということでいます。
class NoDuplicatesList<E> extends LinkedList<E> {
@Override
public boolean add(E e) {
if (this.contains(e)) {
return false;
}
else {
return super.add(e);
}
}
@Override
public boolean addAll(Collection<? extends E> collection) {
Collection<E> copy = new LinkedList<E>(collection);
copy.removeAll(this);
return super.addAll(copy);
}
@Override
public boolean addAll(int index, Collection<? extends E> collection) {
Collection<E> copy = new LinkedList<E>(collection);
copy.removeAll(this);
return super.addAll(index, copy);
}
@Override
public void add(int index, E element) {
if (this.contains(element)) {
return;
}
else {
super.add(index, element);
}
}
}
きすることを真剣に検討することdhillerの回答:
- 代わりに心配に追加オブジェクトの複製以下のリストとして追加しようとすると設定(任意の実装は、自然のフィルタを重複している。
- 時に必要なメソッドを呼び出しを必要とするリストラップで
new ArrayList(set)
(new LinkedList(set)
, い).
この溶液を掲載しまし NoDuplicatesList
には問題は、主に contains()
方法、プラスのクラスの取り扱いはいたしません。確認のための重複コレクションに渡されるお addAll()
方法。
なぜな封止予定リストの並べ替えのように:
new ArrayList( new LinkedHashSet() )
このように、他の実施方にはマスターコレクション;-)
もう、行ったのは、コモンズコレクションや使用のSetUniqueListしてしまっているんですけど走ったかの試験を実施すことができるような最適化の比較の場合に利用したいセットを配列をセットになっています。toArray()メソッドは、SetUniqueTestた20:1時間を記入してトラバース100,000文字列比較のその他の経緯は大違いだ気に優れたパフォーマンス、Iでのご利用はお奨めしのセットを取得し配列の代わりに、SetUniqueListない限り、本当に必要の論理SetUniqueList、確認する必要がある他のソリューション...
の検査コードのmainメソッド:
public static void main(String[]args){
SetUniqueList pq = SetUniqueList.decorate(new ArrayList());
Set s = new TreeSet();
long t1 = 0L;
long t2 = 0L;
String t;
t1 = System.nanoTime();
for (int i = 0; i < 200000; i++) {
pq.add("a" + Math.random());
}
while (!pq.isEmpty()) {
t = (String) pq.remove(0);
}
t1 = System.nanoTime() - t1;
t2 = System.nanoTime();
for (int i = 0; i < 200000; i++) {
s.add("a" + Math.random());
}
s.clear();
String[] d = (String[]) s.toArray(new String[0]);
s.clear();
for (int i = 0; i < d.length; i++) {
t = d[i];
}
t2 = System.nanoTime() - t2;
System.out.println((double)t1/1000/1000/1000); //seconds
System.out.println((double)t2/1000/1000/1000); //seconds
System.out.println(((double) t1) / t2); //comparing results
}
について モハメッドSleem http://abusleem.net/blog
注意:のではありません subList 実施します。
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
public class UniqueList<T> extends ArrayList<T> {
private static final long serialVersionUID = 1L;
/** Unique elements SET */
private final Set<T> set=new HashSet();
/** Used by addAll methods */
private Collection<T> addUnique(Collection<? extends T> col) {
Collection<T> unique=new ArrayList();
for(T e: col){
if (set.add(e)) unique.add(e);
}
return unique;
}
@Override
public boolean add(T e) {
return set.add(e) ? super.add(e) : false;
}
@Override
public boolean addAll(Collection<? extends T> col) {
return super.addAll(addUnique(col));
}
@Override
public void add(int index, T e) {
if (set.add(e)) super.add(index, e);
}
@Override
public boolean addAll(int index, Collection<? extends T> col) {
return super.addAll(index, addUnique(col));
}
}
の 文書を収集ェ "と言ってい
セット—コレクションを含めることはできません重複します。
リストの順番が集められたものであるシーケンス.リストの複製を含むことができます。
でない場合は帳から利用をリストアップしました。
に add
方法、なぜ使用しない HashSet.add()
チェックの重複をなく HashSet.consist()
.
HashSet.add()
戻ります true
ない場合は複製 false
します。
の私の頭のリストを重複している。きを迅速に実施する UniqueArrayList
とオーバーライドすべての add
/ insert
機能チェック contains()
お問い合わせ頂く前に受け継がれています。個人的に使用できみを実施 add
方法を使用し、オーバーライドその他の例外をスローする場合には将来のプログラマが利用するようにして、リストとなっている。
私はただ自分のUniqueList自分のちっちゃな図書館のようになります:
package com.bprog.collections;//my own little set of useful utilities and classes
import java.util.HashSet;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author Jonathan
*/
public class UniqueList {
private HashSet masterSet = new HashSet();
private ArrayList growableUniques;
private Object[] returnable;
public UniqueList() {
growableUniques = new ArrayList();
}
public UniqueList(int size) {
growableUniques = new ArrayList(size);
}
public void add(Object thing) {
if (!masterSet.contains(thing)) {
masterSet.add(thing);
growableUniques.add(thing);
}
}
/**
* Casts to an ArrayList of unique values
* @return
*/
public List getList(){
return growableUniques;
}
public Object get(int index) {
return growableUniques.get(index);
}
public Object[] toObjectArray() {
int size = growableUniques.size();
returnable = new Object[size];
for (int i = 0; i < size; i++) {
returnable[i] = growableUniques.get(i);
}
return returnable;
}
}
いTestCollectionsクラスは以下のようなものです:
package com.bprog.collections;
import com.bprog.out.Out;
/**
*
* @author Jonathan
*/
public class TestCollections {
public static void main(String[] args){
UniqueList ul = new UniqueList();
ul.add("Test");
ul.add("Test");
ul.add("Not a copy");
ul.add("Test");
//should only contain two things
Object[] content = ul.toObjectArray();
Out.pl("Array Content",content);
}
}
に働きます。すべてなので追加設定しない場合はいいがArraylistるリターナブルなどのオブジェクト配列になります。