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

时间:2018-01-10 07:06:09

标签: java android java-7

我一直在搜索关于这个问题的问题,并且大多数只有两个数组比较的问题有一个嵌套循环。我的问题非常相似,但规模更大。假设我的应用程序中有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:只是为了澄清,我不打算像番石榴一样使用第三方库。我在proguard上遇到了问题。

3 个答案:

答案 0 :(得分:5)

修改

刚看到原创海报不能使用Java 8,这很可惜,因为这真的很容易让它变得简单!

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

Java 8解决方案

我将用户flatMap()流式传输到实际的水果元素,然后将Collectors.groupingBy()与下游收集器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()));

答案 1 :(得分:2)

似乎很有可能使用HashMap<Item, Integer> fruits。您可以迭代所有用户(您需要将所有用户存储在某种列表中,例如ArrayList<User> users)并检查每个用户选择的项目列表(我想用户应该有一个字段{{1}在它的身体里存放物品)。你可以用类似的东西来实现它:

ArrayList<Item> items

答案 2 :(得分:1)

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