在多个数组上获取相同的元素值

Get the same element values on multiple arrays

我一直在搜索关于这个问题的问题,大多数问题只有两个数组通过嵌套循环进行比较。我的问题完全相同,但规模更大。假设我的应用程序有 100 或 1000 个用户,每个用户都有它想要的项目列表。 像这样

    User1 = {apple,orange,guava,melon,durian}
    User2 = {apple, melon,banana,lemon,mango}
    User3 = {orange,carrots,guava,melon,tomato}
    User4 = {mango,carrots,tomato,apple,durian}
    .
    .
   Nuser = ...

我想看看所有用户数组中列出了多少个苹果或橘子。所以我基本上是在比较,但规模更大。数据也不是静态的,用户可以从开发人员的知识中输入一个未知的水果,但是根据用户的知识,他们可以把它放在那里,所以可以有多个用户可以放这个未知的水果,但系统仍然可以计算出列出了多少这个未知项目。请记住,这是一个动态的。例如,用户可以达到 100 个用户,具体取决于应用程序的受欢迎程度。我不能在这里做嵌套循环。

PS 这不是确切的问题,但这是我能想到的最简单的情况来解释我的问题。

PS:澄清一下,我不打算像 guava 一样使用第 3 方库。我在混淆器上遇到了问题。

我要么创建一个包含带字符串和整数的 HashMap 的 ArrayList,要么使用两个 ArrayList(一个是 String 类型,一个是 Integer 类型)。然后您可以遍历每个用户数组中的每个条目(这只是一个简单的嵌套循环)。对于当前用户数组中的每个条目,您检查您另外创建的 ArrayList 中是否已经存在相同的条目。如果是,则增加相应的 int。如果不是,则添加一个字符串和一个 int。最后,你得到了添加的 ArrayLists 中所有水果字符串的出现次数,如果我没理解错的话,这就是你想要的。

编辑

刚刚看到楼主不能用Java8,很遗憾,因为这样真的很方便!

Java 7 解

final Map<String, Integer> occurencesByFruit = new HashMap<>();
for (User user : users) {
    String[] fruits = user.getFruits();
    for (String fruit : fruits) {
        final Integer currentCount = occurencesByFruit.get(fruit);
        if (currentCount == null) {
            occurencesByFruit.put(fruit, 1);
        } else {
            occurencesByFruit.put(fruit, currentCount + 1);
        }
    }
}

Java8解

我会直播用户,flatMap() to the actual fruit elements, and then use Collectors.groupingBy() with a downstream collector Collectors.counting()

这将为您提供一个 Map,其中键是水果,值是每个水果在所有用户中的出现次数。

List<User> users = Arrays.asList(/* ... */);

final Map<String, Long> occurencesByFruit = users.stream()
        .map(User::getFruits)
        .flatMap(Arrays::stream)
        .collect(Collectors.groupingBy(f -> f, Collectors.counting()));

似乎使用 HashMap<Item, Integer> fruits 的可能性很大。您可以遍历所有用户(您需要将所有用户存储在某种列表中,例如 ArrayList<User> users)并检查每个用户选择的项目列表(我想用户应该有一个字段 ArrayList<Item> items 在其主体中存储项目)。您可以通过类似的方式实现它:

for (User user : users) { // for each User from users list
    for (Item item : user.items) { // check each item chosen by this user
        if (fruits.containsKey(item) { // if the fruit is already present in the items HashMap increment the amount of items
            int previousNumberOfItems = fruits.get(item);
            fruits.put(item, ++previousNumberOfItems);
        else { // otherwise put the first occurrency of this item
            fruits.put(item, 1);
        }
    }
}