2016-04-07 23 views
0

100個の要素のリストが与えられたら、 要素をリストから取り除くと、どの要素が削除されたのですか?コレクションフレームワークのリスト内の要素を見つける方法

私はインタビューの1つでこの質問をしました。あなたがコレクションbeforeafter要素の削除の内容に異なるの参照を与えられている場合は、コマンド

before.removeAll(after); 

は、削除された1すなわち、ただ一つの要素でbeforeを残すだろうと仮定すると

+2

元のリストだけでなく、要素が削除されたリストも指定されていますか? –

+0

重複していますか? https://stackoverflow.com/questions/919387/how-can-i-calculate-the-difference-between-two-arraylists –

+0

'List'はAPI仕様に従って注文されています...もし' List'、 '' 'after'は本当に' List :: 'before ::' List :: remove'を介して一つの要素を削除した 'List''、' before'です。これを繰り返すだけで、 'before.get(i)!= after.get( i) '。 – user2478398

答えて

0

残りの要素は削除された要素と等しくありません。

そうでない場合は、削除が行われている方法に応じて、あなたは、インデックス付きの削除(Listの例えば、サブクラス)をサポートするコレクションのいずれかのパラメータとして、remove(element)またはremove(elementIndex)の戻り値として除去する要素を取得します。

+0

'Set'では動作しますが、' List'では動作しません。たとえば 'before 'が' [1,1] 'で、' after'が '[1]'なら 'removeAll'は' [] 'となります。 –

+0

これを解決するには、 'after'の次の値と一致しない' before'の値を出力し、スキップしてパラレル反復を行います。 – Andreas

+0

@PaulBoddington良い点、私は答えを更新しました。ありがとう。 – PNS

0

新しいコレクションと古いコレクションが指定されている場合、最も簡単な仕組みは新しいコレクションの各アイテムを古いコレクションから削除することです。残っているのは両者の違いです。 Javaの8で例えば

、:

newCollection.stream().forEach(oldCollection::remove); 

それは削除サポートするすべてのコレクションのために働く必要がありますので、streamremove方法はCollectionインタフェースの両方であるので、これは動作します。 newCollectionの各アイテムに対してremoveが一度呼び出されるため、重複するアイテムに役立つそれぞれのインスタンスが1つだけ削除されます。

removeがコレクションでサポートされていない場合は、簡単な解決策は、このメソッドを使用する前に、新しいコピーを作成することです(例えばnew ArrayList<>(oldCollection)):

あなたは、特にあなたができるその後、インデックス付きのコレクションに一つの項目を探しているなら

IntStream.range(0, oldCollection.size()) 
    .filter(n -> n >= newCollection.size() 
     || !oldCollection.get(n).equals(newCollection.get(n))) 
    .findFirst(); 

これは何のアイテムが削除されていないいる状況を可能にするためにOptionalを返します。ちょうどはるかに安価であると一致しない最初のものを探してください。

0

彼らは100個のint要素を与え、コレクションから1個のintを削除すると仮定します。 100要素に対してsum()を、99要素に対してもう1つのsum()を実行することができます。次に、2つの合計の間で減算を行うと、コレクションから削除された要素が取得されます。

+0

これはコレクションが数値である場合にのみ回答します(私は間違った質問を読んでいるかもしれませんが、数値が指定されたとは思わないかもしれません) –

+0

@BenedictLewis質問自体は不明です。それは私が "仮定する"という言葉を使用していた理由です。 –

関連する問題