Tengo este problema en el que necesito algo que coincida con un código de área con un número de teléfono, y al final necesito el recuento de números de teléfono en cada código de área, creo que puedo usar un mapa. ¿Tienes alguna idea?

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)
0
user8807292 13 ene. 2018 a las 03:54

3 respuestas

La mejor respuesta

Puede usar un mapa para almacenar los recuentos de cada código de área:

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

Usé Strings para almacenar los area_codes en caso de que alguno comience con 0.

1
user4020527 13 ene. 2018 a las 01:15

Primero, cree una clase con dos campos, uno para representar el código de área (String) y otro para representar el número de teléfono (String). Una vez que esté completo, puede girar sin importar la cantidad de objetos necesarios; rellenarlo con los datos necesarios y luego almacenarlo en una Lista.

Una vez hecho esto, puede usar un groupingBy para contar el Número de números de teléfono que pertenecen a cada grupo (código de área) como este:

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

O si solo quieres imprimir, entonces puedes hacer:

myList.stream()
      .collect(Collectors.groupingBy(ClassName::getAreaCode, Collectors.counting()))
      .forEach((k, v) -> System.out.println(String.join(":", k, v.toString())));
4
Ousmane D. 13 ene. 2018 a las 17:52

Suponiendo que tiene una clase Phone de la siguiente manera:

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; }
}

Luego, una vez que tenga una lista de teléfonos, como este:

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

Puede usar transmisiones (como en respuesta de Aominè) o la método Map.merge, de esta manera:

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

Esto itera la lista de números de teléfono y, para cada uno de ellos, coloca una entrada en el mapa result, siendo el código de área la clave y 1 el valor. Si, para el número de teléfono actual, el mapa ya contenía una entrada con su código de área, entonces, 1 se agrega al valor de esa entrada a través de la función de fusión Integer::sum.

3
Federico Peralta Schaffner 13 ene. 2018 a las 17:37
48235951