5

2つのリストがあるとします。

List<String>products = new ArrayList<String>(); 
products.add("computer"); 
products.add("phone"); 
products.add("mouse"); 
products.add("keyboard"); 

List<String>cart = new ArrayList<String>(); 
cart.add("phone"); 
cart.add("monitor"); 

カートリストのアイテムが製品リストにいくつあるかを確認する必要があります。上記のリストの場合、答えは1になります(電話は製品とカートに入っているため)。カートリストが次の場合:

List<String>cart = new ArrayList<String>(); 
cart.add("desk"); 
cart.add("chair"); 

結果は0になります。カートにコンピューター、マウス、机、椅子が含まれている場合、結果は2になります(コンピューターとマウスの場合)。

Apache CommonsCollectionsまたはGoogleCollectionsAPIに何かありますか?私はそれらを調べて、バッグの数を取得する方法を見つけましたが、何かが足りない可能性はありますが、別のリストからは取得していません。今のところ、私が考えることができる唯一の方法は、カートのアイテムを繰り返し処理し、製品に個々のアイテムが含まれているかどうかを確認し、カウントを維持することです。カウント(ブール値ではない)が必要なため、 containsAllを使用できません。カート内のすべてのアイテムが製品リストに存在しない場合は失敗します(これは発生する可能性があります)。

それが重要な場合、私はJava1.6を使用しています。

4

8 に答える 8

13

別のコレクションを作成する場合は、次の操作を実行できます。

List<String> productsInCart = new ArrayList<String>(products);
productsInCart.retainAll(cart);

これにより、カートと製品の両方に表示されるすべてのエントリが表示されます。

于 2010-04-22T01:33:48.520 に答える
10
int count = 0;
for (String item : cart) {
   if (products.contains(item))
    count++;
   }
}
于 2010-04-22T01:08:12.033 に答える
4

コードを 1 行余分に並べ替えて (実行時間のコストを加えて)、別のメソッドを呼び出して封じ込めチェックを行うと、非常に長い製品リストに対して非常に効率的なものを得ることができます( list はランダム アクセスには効率的であり、製品のリストの順序はアプリにとって重要ではありません):

Collections.sort(products);  // or maintain products in sort order at all times
int count = 0;
for(String i: cart) {
  if (Collections.binarySearch(products, i) >= 0) {
    count++;
  }
}
于 2010-04-22T01:51:56.130 に答える
2

データセットが小さい場合、または速度を気にしない場合は、bart の回答で十分です。ただし、大規模なデータ セットがあり、O(N*N) の複雑さを望まない場合は、これを使用できます (製品名が重複していないと仮定します)。

Set<String> productsSet = new HashSet<String>(products);

次に、Bart のコードを にproducts置き換えて使用しproductsSetます。

これにより、O(N) 時間で結果が得られますが、より多くのメモリが消費されます。

于 2010-04-22T01:53:32.953 に答える
2

Collectionsここでは、静的な頻度法が役立つと確信しています。

List<String>products = ...
List<String>cart = ...

for (String cartItem : cart) {
       int occurrences = Collections.frequency(products, cartItem);

       if (occurrences > 0) {
          System.out.println(cartItem + ": " + occurrences);
       }
} 

これはjdk 1.6です。cart-listの項目が商品に存在する場合、出現回数とともに出力されます。if0-occurrences も出力したい場合は、 -clause を削除してください。

于 2010-04-22T01:25:02.013 に答える
1

別のコレクションを作成することが制約でない場合は、両方のリストのリスト要素をセットに追加するだけです。次に、最終的なセットのサイズと 2 つのリストのサイズの合計の差が答えです。

于 2010-04-22T01:09:44.143 に答える
1

投稿された解決策の多くは、「カート リスト内のアイテムが製品リストにいくつ存在するかを調べる必要があります。」に対して機能しますが、それらは異なる仮定に基づいている可能性があります。

製品またはカートの各要素が一意である必要があると仮定すると、一部は機能します。この場合、ArrayList の代わりに HashSet を使用して、これを強制することができます。

要素が製品にある場合、その特定の製品が無制限に存在すると仮定すると、カート内の繰り返し要素に対しても機能するものもあります。これを仮定できないとうまくいきません。つまり、製品内の要素の出現数が会社の在庫数を意味すると仮定します。この場合、HashMap などの他のデータ構造の使用を検討することをお勧めします。

最終的には仮定に帰結すると思います。正確な条件を見つけて、問題に最も適したソリューションを決定する必要があります。

于 2010-04-22T02:46:35.537 に答える