2

一般的な Java ライブラリで、有限コレクション内の要素を検索し、一致する要素 が 1 つだけであること 確認する方法を提供するものはありますか?

このメソッドは、たとえば、null何も見つからなかった場合に戻り、複数の要素が見つかった場合に例外をスローすることができます。

現在、私は独自の実装 (以下を参照) を使用していますが、そのようなユーティリティ メソッドでビジネス コードを汚染したくはありません (別のユーティリティ パッケージに抽出されたとしても)。

また、コレクションを複数回反復するオーバーヘッドや、コレクションをフィルタリングして結果の長さを確認するオーバーヘッドも必要ありません。

PS私の現在のソリューション(これは機能しますが、ライブラリメソッドに置き換えられます):

public static <T> T getSingleMatch(Iterable<T> lookIn, com.google.common.base.Predicate<? super T> predicate) {
    T foundItem = null;
    for (T item : lookIn) {
        if (predicate.apply(item)) {
            if (foundItem != null) 
                throw new RuntimeException("multiple matches"); // alternatively: `return null;` 
            else 
                foundItem = item;
        }
    }
    // alternatively: `if (foundItem == null) throw ...`
    return foundItem;
}
4

2 に答える 2

3

1 つのオプションは、2 つのアイデアを 2 つのメソッドに分けて、各メソッドが 1 つのことを行うようにし、呼び出しを結合することです。

  • 遅延フィルター処理を行い、一連の一致する結果を返す1 つのメソッド
  • シーケンスからアイテムを返すための 1 つのメソッドで、それが唯一のアイテムである必要があります

グアバにはそれらの両方があります:

たとえば、次のようになります。

String match = Iterables.getOnlyElement(Iterables.filter(source, predicate));
于 2013-08-23T07:21:17.203 に答える
2
int index = collection.indexOf(item);
if (index != -1 && index == collection.lastIndexOf(item)) {
    // one and only one
}

index != -1そのようなアイテムがないことを意味する場合。次の if ステートメントが true と評価されない場合、少なくとも 2 つの項目があることを意味します。例外をスローするか、null を返すか、インデックスまたは項目を返すように再構築できます。あなたの質問に基づいてこれを行う方法を知っていると信じています。

于 2013-08-23T07:19:05.587 に答える