【问题标题】:How to check hashset for an existing element and then adding a count如何检查现有元素的哈希集,然后添加计数
【发布时间】:2019-07-27 04:56:12
【问题描述】:

我是 Java 初学者,开始学习如何使用哈希集。我的练习有问题。目标是删除重复的描述,然后添加相似描述的计数。

例如我有,

计算机科学 - 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);
  }
}

我只是纠结于如何添加类似描述的数量。谢谢!

【问题讨论】:

  • 你能分享你的完整代码示例吗?
  • 完整代码有一千行
  • 但是你没写过“千行”吧?请分享您编写的代码。很难看出为什么在这里需要 HashSet,HashMap 看起来是更适合该问题的解决方案。
  • 你应该分享你的问题的一个工作示例,以便 wie 可以重现它。
  • 我已经复制了我有问题的完整代码的一部分

标签: java hashset distinct-values


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    解决问题的一个聪明方法是使用 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) -&gt; count0 + count1 通过对值求和来处理它。 LinkedHashMap::new是为了维护秩序。

    现在您可以像这样打印摘要:

    summaryReport.forEach((course, count) -> System.out.println(course + " - " + count));
    

    结果:

    Computer Science - 40
    Engineering - 20
    Dentistry - 17
    Architecture - 11
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-26
      • 2015-12-03
      • 2010-09-08
      • 1970-01-01
      • 2012-11-08
      • 2017-04-12
      • 1970-01-01
      相关资源
      最近更新 更多