我想计算arraylist“list1”中的元素在另一个arraylist“list2”中出现的频率。
我想要这个输出:
A 2
B 0
C 1
D 2
我得到这个输出:
A 0
B 0
C 0
D 69
你能帮我做这个吗?谢谢您!
enter code here
HashMap<Character, Integer> map = new HashMap<Character, Integer>();
ArrayList<Character> list1 = new ArrayList<Character>();
ArrayList<Character> list2 = new ArrayList<Character>();
Collections.addAll(list1, 'A', 'B', 'C', 'D');
Collections.addAll(list2, 'D', 'A', 'C', 'A', 'D');
for (int i = 0; i < list1.size(); i++) {
for (int j = 0; j < list2.size(); j++) {
if (list1.get(i) == list2.get(j)) {
map.put(list1.get(i), 1);
}
if (list1.get(i) == list2.get(j) && (map.containsKey(list1.get(i)))) {
map.replace(list1.get(i), list1.get(i) + 1);
}
if (list1.get(i) != list2.get(j)) {
map.put(list1.get(i), 0);
}
}
}
System.out.println("Map: ");
for (Map.Entry<Character, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + " " + entry.getValue());
}
3条答案
按热度按时间pobjuy321#
使用方法
frequency
,即:如果你是单行道的粉丝:
包括元素的打印:
顺便说一句,你最初的回答几乎是正确的,你只需要重新考虑一下条件,以及它们的顺序:
另一个建议是,如果不需要显式地使用循环索引,那么最好使用习惯用法
for (Character c1 : list1)
而不是for(int i = 0; i < list1.size(); i++)
. 第一个版本比第二个版本更干净,更不容易出错。此外,还可以使用变量c1
而不是list1.get(i)
总是。jei2mxaa2#
您可以使用Java8中引入的流api来完成此任务。下面是解决问题的示例代码:
注意:对于这组问题,我建议您从编写一些单元测试开始实现。
cs7cruho3#
没有额外循环的更干净的java 8解决方案是:
如果特定任务是打印频率,则可以完全跳过中间Map:)