2011-12-22 10 views
2

私はid、cnk、productという3つの変数を持つRizivオブジェクトを持っています。次に、このオブジェクトのデータバンクを検索し、ArrayListに追加します(ArrayList<Riziv>リスト)。
配列内のすべてのオブジェクトが同じcnkである場合はチェックアウトする必要があります。そうでない場合は、同じではないすべてのオブジェクトを返す必要があります。cnkエラーメッセージが表示されます。arrayListの複製要素と重複しない要素を取得する方法は?

public class Riziv{ String id, cnk, product; } 
    ArrayList<Riziv> list = getArrayListFromDatabank(id); 

    public void getDuplicatedWhichHasTheSameCnk(){ 

    } 
    } 
+0

"同じcnkでないすべてのオブジェクト"と言うとき、正確に何をしたいですか?特に、* what *と同じcnkではありませんか? – Gabe

+0

Peter Lawreyが最高の答えを示していますが、cnk = xxxの場合は4、cnk = yyyの場合は4、cnk = zzzの場合は4など、複数の重複がある場合は何をしたいのかは不明です。 – Vort3x

+0

すべての要素のcnkが同じ場合、trueを返します。すべての要素を含むarrayListを返していない場合。 – itro

答えて

1

(マルチマップは、グアバによって提供される)標準JVM構造を使用して、あなたはそれを行うことができます。

public List<Riviz> getDuplicates(final List<Riviz> l) 
{ 
    final HashMap<String, List<Riviz>> m = new HashMap<String, List<Riviz>>(); 
    final List<Riviz> ret = new ArrayList<Riviz>(); 

    String cnk; 

    for (final Riviz r: l) { 
     cnk = r.getCnk(); 
     if (!m.contains(cnk)) 
      m.add(cnk, new ArrayList<Riviz>()); 
     m.get(cnk).add(r);    
    } 

    List<Riviz> tmp; 
    for (final Map.Entry<String, List<Riviz>> entry: m.entrySet()) { 
     tmp = entry.getValue(); 
     if (tmp.size() == 1) // no dups 
      continue; 
     ret.addAll(tmp); 
    } 

    return ret; 
} 

retは重複が含まれています。代わりにMap<String, Riviz>を返すようにその関数を変更して、リストサイズが1だけのエントリを除外することができます。競合するcnksをキーとしての値としてdupsのリストを取得します。

+0

私はRivizクラス内の何かを変更することはできません。私のコントロール外です。 arrayListに複製され複製されない他の方法はありますか? – itro

+0

それから 'Comparator'を使います。 – fge

+0

編集された回答を参照してください:これはおそらくあなたの問題に答えます。 – fge

1

これを行う1つの方法は、リストをcnk Stringでソートし、各連続したcnkストリングを次のストリングと比較するコンパレータを作成することです。重複が見つかった場合、それらは互いにすぐ隣にあります。

1.)cnk変数をソートしてコンパレータを使用してリストをソートします。

2.)リストの各要素を重複の次の要素と比較します。

これを解決するには他にも多くの方法がありますが、これは最初のことです。

私はあなたが笑あらかじめご了承されているので、これをテストしていない:

ArrayList<Riziv> rizArray = new ArrayList<Riziv>(); 
     //Sort the array by the CNK variable. 
     Collections.sort(rizArray, new Comparator<Riziv>(){ 
      @Override 
      public int compare(Riziv arg0, Riziv arg1) { 
       //Return the comparison of the Strings. 
       //Use .compareToIgnoreCase if you want to ignore upper/lower case. 
       return arg0.getCnk().compareTo(arg1.getCnk()); 
      } 
     }); 
     //List should be in alphabetical order at this point. 
     List<Riziv> duplicates = new ArrayList<Riziv>(); 
     Riziv rizPrevious = null; 
     for(Riziv riz: rizArray){ 
      if(rizPrevious == null){ 
       rizPrevious = riz; 
       continue; 
      } 
      if(riz.getCnk().compareTo(rizPrevious.getCnk()) == 0){ 
       duplicates.add(riz); 
      } 
      rizPrevious = riz; 
     } 
+0

同じコードを入れてください。 – itro

+0

コードを提供してください。 – itro

2

私はあなたがしかし、私はあなたがこのような何かをしたい疑うたい正確に何明確ではありませんよ。

MultiMap<Key, Riziv> multiMap = 
List<Riziv> list = 
for(Riziv r: list) 
    multiMap.put(r.getCnk(), r); 

for(Key cnk: multiMap.keySet()) { 
    Collection<Riziv> sameCnk = multiMap.get(cnk); 
    // check size and compare entries 
} 

マルチマップには、各CnkのRizivオブジェクトのリストがあります。

+0

はい、これはarrayListの中に似たような非類似のelemetに必要なものです。要素のcnkをどのように比較できますか? – itro

+0

JDKではMultiMapが標準ではありません); – fge

+0

@itro同じcnkを持つすべての要素を取得するための例を追加しました。 –