如何检查现有元素的hashset,然后添加计数

问题描述 投票:-2回答:2

我是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 hashset distinct-values
2个回答
1
投票

解决问题的一种聪明方法是使用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

0
投票

从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();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.