Java - 如何在另一个列表的列表中查找项目数

时间:2010-04-22 01:05:48

标签: java list count java-6

说我有两个清单:

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 Commons CollectionsGoogle Collections API中有什么内容吗?我仔细查看过它们,看看如何计算行李数,但不是从另一个列表,尽管我可能会遗漏一些东西。现在,我能想到的唯一方法是迭代购物车商品,看看产品contains是否是单个商品并保持计数。我不能使用containsAll因为我需要计数(不是布尔值),如果购物车中的所有商品都不存在于产品列表中(这可能会发生),那么这将失败。

如果重要的话,我正在使用Java 1.6。

8 个答案:

答案 0 :(得分:11)

如果您愿意创建另一个集合,可以执行以下操作:

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

这将为您提供购物车和产品中出现的所有条目。

答案 1 :(得分:10)

int count = 0;
for (String item : cart) {
   if (products.contains(item))
    count++;
   }
}

答案 2 :(得分:4)

对于要排序的一行额外代码(加上运行时成本),然后调用另一种方法来进行包含检查,您可以获得对于非常有效的产品列表非常有效的内容long (只要该列表对随机访问有效且产品的列表顺序对应用程序不重要):

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++;
  }
}

答案 3 :(得分: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 - 列表中的项目,则会打印出现次数。如果要打印0次,只需删除if - 子句。

答案 4 :(得分:2)

如果您的数据集较小或者您不关心速度,那么bart的答案应该足够了。但是当你有一个大数据集并且不想要O(N * N)复杂度时,你可以使用它(假设没有重复的产品名称)

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

然后使用Bart的代码,products替换为productsSet

这应该会在O(N)时间内给出结果,但会花费更多的内存。

答案 5 :(得分:1)

如果创建另一个集合不是约束,那么只需将两个列表中的列表元素添加到Set中。然后,最终设置大小的差异和两个列表的大小总和就是你的答案

答案 6 :(得分:1)

发布的许多解决方案的工作都是“我需要查看产品列表中存在购物车列表中的项目数量。”,但它们可能基于不同的假设。

如果您假设产品或购物车中的每个元素必须是唯一的,那么有些工作。在这种情况下,您可能希望使用HashSet而不是ArrayList来强制执行此操作。

其他工作甚至适用于购物车中的重复元素,如果我们假设如果元素在产品中,则存在无限数量的特定产品。如果我们不能假设这一点就行不通,即我们假设产品中元素的出现次数意味着公司拥有的股票数量。在这种情况下,您可能需要考虑使用其他数据结构,例如HashMap。

我猜最终归结为假设。您应该找出确切的条件并确定哪种解决方案最适合您的问题。

答案 7 :(得分:0)

您可以使用 Stream API 过滤和统计 productscart 的元素。

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        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");

        cart.forEach(item -> System.out.println(item + ": " + products.stream().filter(e -> e.equals(item)).count()));
    }
}

输出:

phone: 1
monitor: 0

或者,您可以使用 Collections#frequency 打印 cart 中每个项目的频率:

products

或者,对于 for (String item : cart) { System.out.println(item + ": " + Collections.frequency(products, item)); } 中的每个项目,您可以迭代 cart 并计算出现次数:

products