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)
3 respuestas
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
.
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())));
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
.
Nuevas preguntas
java
Java es un lenguaje de programación de alto nivel. Utilice esta etiqueta cuando tenga problemas para usar o comprender el idioma en sí. Esta etiqueta rara vez se usa sola y se usa con mayor frecuencia junto con [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] y [maven].