我是Java的初学者,并开始学习如何使用hashsets。我的练习练习有问题。目标是删除重复的描述,然后添加类似描述的计数。
比如我有,
计算机科学 - 15 工程 - 20 牙科 - 10 建筑 - 11 计算机科学 - 25 牙科 - 7
那么输出应该只是:
计算机科学 - 40 工程 - 20 牙科 - 17 建筑 - 11
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
//printing summary report
ArrayList<String> summaryReport= new ArrayList<String>();
final String[] CourseDesc = {"Computer Science", "Architecture", "Dentistry", "Computer Science"};
final int[] CourseCount = {15, 10, 10, 25};
for (String element: CourseDesc) {
for(int el: CourseCount){
summaryReport.add(element + " "+ el);
}
}
System.out.println(summaryReport);
}
}
我只是坚持如何添加类似描述的计数。谢谢!
解决问题的一种聪明方法是使用Java Streams:
final String[] courseDesc = {"Computer Science", "Engineering", "Dentistry", "Architecture", "Computer Science", "Dentistry"};
final int[] courseCount = {15, 20, 10, 11, 25, 7};
Map<String, Integer> summaryReport = IntStream.range(0, courseDesc.length).boxed()
.collect(Collectors.toMap(
index -> courseDesc[index], index -> courseCount[index],
(count0, count1) -> count0 + count1, LinkedHashMap::new
));
这将创建一个Map,其中课程为关键,总和为值。如果地图包含一个课程并且再次收集相同的课程,则lambda表达式(count0, count1) -> count0 + count1
通过对值进行求和来处理它。 LinkedHashMap::new
是维持秩序。
现在您可以打印如下摘要:
summaryReport.forEach((course, count) -> System.out.println(course + " - " + count));
结果:
Computer Science - 40
Engineering - 20
Dentistry - 17
Architecture - 11
从OP我可以看到你需要一个关联键值容器,所以最明显的方法是使用Map
,检查值是否作为键存在,如果不是 - 用1
计数器添加它,如果存在 - 添加+ 1
:
void test() {
Map<String, Integer> summaryReport = new HashMap<>();
String curDesc = "whatever";
Integer count = summaryReport.get(curDesc);
if (count == null) {
summaryReport.put(curDesc, 1);
} else {
summaryReport.put(curDesc, count + 1);
}
}
以更棘手的方式做,你可以使用可变的AtomicInteger
作为计数器:
void test() {
Map<String, AtomicInteger> summaryReport = new HashMap<>();
AtomicInteger counter = summaryReport.putIfAbsent("whatever", new AtomicInteger(0));
if (counter != null) {
counter.incrementAndGet();
}
}