2016-09-07 11 views
0

したがって、私は2d配列(本当にList of Lists)を持っています。2d配列のハッシュアイテムですが、1つのインデックスにしかありません

基本レイアウトは一致のリストであり、各一致はID番号と日付を持ちます。私は各IDが一度しか現れないようにすべての重複を削除する必要があります。一致のリストにIDが複数回表示された場合は、最新の日付で試合を行いたいと思います。

私の現在の解決策では、List of MatchesをHashSetに追加し、それをArrayListに変換しています。しかし、それは正確なマッチの重複を取り除くことであり、同じIDが異なる日付の場合は複数回出現します。

Set<Match> deDupedMatches = new HashSet<Match>(); 
deDupedMatches.addAll(originalListOfMatches); 
List<Match> finalList = new ArrayList<Match>(deDupedMatches) 

で来て私の元データが

{(1, 1-1-1999),(1, 2-2-1999),(1, 1-1-1999),(2, 3-3-2000)}

であれば、私は戻って取得することは

{(1, 1-1-1999),(1, 2-2-1999),(2, 3-3-2000)}

である。しかし、私が本当に探していますがそれだろうなソリューションです私を与える

{(1, 2-2-1999),(2, 3-3-2000)}

元のリストを同じ基本的な方法でハッシュしているが、IDだけを使用しているという曖昧な考えがありました。基本的には、私は反復可能なIDに基づいて "バケツ"で終わるだろうし、それに複数のマッチがあったバケツで正しいものを選ぶことができた。私をぶつけているのは実際のハッシュです。私はマッチを私が考えているやり方で崩壊させることができるかどうか、あるいはどうすればよいか分かりません。

+0

... – Javant

+1

を.putこの質問には、Matchオブジェクトの2次元配列が正しく与えられています。あなたは重複権利がないリストにそれを圧縮したいですか?辞書を使用して2-Dリストをループすることはできませんし、キー(この場合はID)が存在するかどうかをチェックし、そうであれば日付を比較しますか?多分私はこの質問を非常によく理解していないでしょう。 –

+0

@MichaelPlattあなたは考えが正しいので、私はそのオプションも考慮しています。私は主に、すべての要素を繰り返し処理し、すべての衝突をチェックするだけでなく、効率的な/実行可能な方法があるのだろうかと疑問に思っていた。 –

答えて

1

あなたの質問が正しく理解されている場合は、最新の日付のリストから別のIDを取得したいと考えています。

あなたのMatchはクラスであるため、フィールドがSetによって参照されていないため、互いに比較するのは簡単ではありません。

この問題を回避するには、別のキーと値をリンクできるようにするHashMapを使用します。 キーを繰り返すことはできません。値は変更できます。ループしながら、
私はこのような何かをするだろう:

if(map.putIfAbsent(match.getID(), match) != null &&  
    map.get(match.getID()).getDate() < match.getDate()){ 
    map.replace(match.getID(),match); 
} 
  • をだから何それは行うことは、それはあなたの試合をループです。
  • IDが存在しない場合は、現在の一致IDを入力します。
  • .putIfAbsentは、存在しない場合はnullの古い値を返します。
  • 次に、putIfAbsent(1つの石で2羽の鳥)を使用して、そのIDで地図にアイテムがあるかどうかを確認します。二つの日付を比較しても安全であることを後
  • - 新しいものは後で、現在のマッチを置き換えている場合
  • (反復からマップに1つ、1 <は、あなたの比較方法のための試験です)。
  • 最後に、あなたのリストを取得するために使用します。

これにより、重複IDが削除され、最新のものだけが残されます。

タイプミスやコードエラーの謝罪は、電話で行われました。コメントの誤りを私に通知してください。

のJava 7は.putIfAbsentと.replace機能を持っていないが、彼らは.containsのために置換されたことができると私は理解していそうだとすれば、我々はコードなしで助けになっているか

+0

あなたのコードにいくつか微調整を加えなければならなかったのですが、私が8の代わりにJava 7を使用しているので、 map.putIfAbsent() 'または' map.replace() 'です。また、<演算子の代わりに 'date.before()'を使う必要もありました。しかし、これはすべて非常に役に立ちました。 –

+0

@ D.Spetzああ、これはあまり問題ではないし、私はそれに応じて答えを出した。 >については、あなたの比較方法のための擬似であった –

関連する問題