0

私は追加情報を持つ人々のリストを持っています - 例えば本のレンタルとしましょう。したがって、リスト内の各 Rental-object には、属性としての Person-object とレンタル情報が含まれます。人ごとに、リストには 1..n のエントリがあります。

ここで、いくつかの基準に基づいてこのリストをフィルタリングする必要があります。エントリの 1 つが特定の基準に一致する場合、他のエントリが基準に一致しなくても、その人物のすべてのエントリを削除したいと考えています。

1 つのフィルターでこれを行う良い方法はありますか? 別の方法は、リストをスキャンし、エントリを削除する必要がある人を特定してから、次のようなものを適用することです

Collections2.filter(myList, new MyPredicate(peopleIWantToRemove))

しかし、私は一度だけのリストトラバーサルでそれをやりたいと思っています。これどうやってするの?

4

5 に答える 5

1

リストを 2 回調べても (1 回目はすべての「悪い」人を特定し、2 回目はそれらを削除します)、アルゴリズムの実行時の観点からは、完全に無害です。リストを 1 回または 2 回調べても、アルゴリズムは O(n) 時間で実行されます。

ただし、リストを 1 回だけ確認することに真剣に取り組んでいる場合は、排除したい人物のリストと一緒に、各人物が出現するすべての場所を追跡する一時的なデータ構造を作成できます。

Map<Person, List<Rental>> rentalsPerPerson;
List<People> badPeople;

最初にリストを解析するときに、これら 2 つの構造を入力します。次に、 のリストを調べて、オブジェクトbadPeopleのリストを取り出し、Rental元のリストから一度に 1 つずつ削除します。

しかし、正直なところ、それは多くのメリットがないため、多くの面倒のように感じます.

私がそれを行うことをお勧めする方法は?リストを 2 回確認します。最初のパス:Set悪い人をコンパイルします。2 番目のパス: 新しい outputListを作成します。最初は空です。元のList. 各要素について、がセットにPersonない場合はBad、エントリを output に追加しますList

于 2013-02-01T15:14:36.053 に答える
0

次に、いくつかの基準に基づいてこのリストをフィルタリングする必要があります。エントリの1つが特定の基準に一致する場合、他のエントリが基準に一致しない場合でも、その人のすべてのエントリを削除したいと思います。

フィルタリングをしていなかったと思います。フィルタリングは、ある条件に対してsubCollection(フィルタリングされた)を返すためです。常に同じ人物リストを取得しますが、一部の要素が変更されています。

Pythonのようなものが必要ですmap(list, function)。リストを調べて、一人一人が何かをします。

Guavaのcollections.transformがそれを実行できます。

public static <F,T> Collection<T> transform(Collection<F> fromCollection,
                            Function<? super F,T> function)

見てみな:

http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Collections2.html#transform(java.util.Collection、com.google.common.base.Function

于 2013-02-01T15:21:21.317 に答える
0

C-Ottoが言ったように、悪い人の基準(最初に悪いエントリ)に基づいてリストをソートし、次にステートフル述語を使用してフィルタリングします

于 2013-02-01T15:13:14.517 に答える
0

述語をステートフルにして、何らかの基準が満たされた場合だけでなく、その人が「悪い」人として知られている場合にも一致するようにします。

于 2013-02-01T15:01:09.903 に答える
0

Iterables.filter()代わりに使用してください。クラスのドキュメントによると、「特に明記されていない限り、このクラスで生成されるイテラブルはすべて遅延型です。つまり、それらのイテレータは、絶対に必要な場合にのみバッキング イテレーションを進めます。」つまり、複数のフィルターを構成できますが、自分で行う場合、トラバーサルは 1 回しか行われません。

于 2013-02-01T15:10:30.973 に答える