在多个数组上获取相同的元素值
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);
}
}
}
我一直在搜索关于这个问题的问题,大多数问题只有两个数组通过嵌套循环进行比较。我的问题完全相同,但规模更大。假设我的应用程序有 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);
}
}
}