如何在HashMap中计算通信?

时间:2018-01-13 00:54:48

标签: java hashmap

我有这个问题,我需要一些东西来匹配带有电话号码的area_code,最后我需要每个area_code中的phoneNumbers计数,我想我可以使用Map。你有什么想法吗?

Example

Given area_code: 351 phone_number:123456
Given area_code: 351 phone_number:1234567
Given area_code: 111 phone_number:678904

Output
351:2 (2 is the count on the numbers)
111:1 (1 is the count on the numbers)

3 个答案:

答案 0 :(得分:4)

首先,创建一个包含两个字段的类,一个用于表示区号(String),另一个用于表示电话号码(String)。一旦完成,你就可以旋转所需的许多物体;用必要的数据填充它,然后将其存储到List中。

完成后,您可以使用groupingBy收集器来计算属于每个组的电话号码(区号),如下所示:

Map<String, Long> resultSet = 
       myList.stream()
             .collect(Collectors.groupingBy(ClassName::getAreaCode, Collectors.counting()));

或者如果您只想打印,那么您可以这样做:

myList.stream()
      .collect(Collectors.groupingBy(ClassName::getAreaCode, Collectors.counting()))
      .forEach((k, v) -> System.out.println(String.join(":", k, v.toString())));

答案 1 :(得分:3)

假设你有一个public class Phone { private final String areaCode; private final String number; public Phone(String areaCode, String number) { this.areaCode = areaCode; this.number = number; } public String getAreaCode() { return areaCode; } public String getNumber() { return number; } } 课程如下:

List<Phone> phoneNumbers = Arrays.asList(
    new Phone("351", "123456"),
    new Phone("351", "1234567"),
    new Phone("111", "678904"));

然后,一旦你有一个电话列表,比如这个:

Map<String, Integer> result = new HashMap<>();
phoneNumbers.forEach(phone -> result.merge(phone.getAreaCode(), 1, Integer::sum));

您可以这样使用任一流(例如Aominè's answer)或Map.merge method

result

这会迭代电话号码列表,对于每一个电话号码列表,它会在1地图中放入一个条目,区号为关键字,1为值。如果对于当前电话号码,地图已包含带有区号的条目,则Integer::sum将通过'Parameter ... implicitly has an 'any' type合并功能添加到该条目的值。

答案 2 :(得分:1)

您可以使用Map存储每个area_code的计数:

private HashMap<String, Integer> areaCodes = new HashMap<String, Integer>();

public void addAreaCode(String areaCode) {
    if (areaCodes.containsKey(areaCode)) {
        areaCodes.put(areaCode, areaCodes.get(areaCode) + 1);
    } else {
        areaCodes.put(areaCode, 1);
    }
}

public void foo() {
    addAreaCode("351");
    addAreaCode("351");
    addAreaCode("111");

    for (String areaCode : areaCodes.keySet()) {
        System.out.printf("%s:%d\n", areaCode, areaCodes.get(areaCode));
    }
}

我使用字符串存储area_codes以防任何以0开头。