0

我有一个电话号码列表,我曾经按国家(德国号码)/国际(世界其他地区)分组。示例列表如下所示:

List<String> list = new ArrayList<>();
list.add("+4969123");
list.add("+4989123");
list.add("+4930123");
list.add("+4365013");
list.add("+4369923");
list.add("+4365023");
list.add("+4176123");
list.add("+4178123");
list.add("+4179123");
list.add("+447782");
list.add("+447903");
list.add("+447701");

以及按前缀“+49”分组的方法

public static Map<Boolean,List<String>> national_International_Map(List<String> list){
    return list.stream().collect(Collectors.groupingBy(s -> s.startsWith("+49")));
}

然后我不能用 true 或 false 调用该方法来将数字分隔为国家/国际

List<String> nationalNums      = national_International_Map(list).get(true);
List<String> internationalNums = national_International_Map(list).get(false);

但现在要求发生了变化,我必须按国家/地区对数字进行分组。目前只有四个国家。但以后可能会添加更多。为此,我考虑了以下几点,但如果我必须对更多国家进行分组,那就很复杂了。

public static Map<Boolean,List<String>> countryMap(List<String> list, String country){
    switch(country){
        case "de": return list.stream().collect(Collectors.groupingBy(s -> s.startsWith("+49")));
        case "at": return list.stream().collect(Collectors.groupingBy(s -> s.startsWith("+43")));
        case "ch": return list.stream().collect(Collectors.groupingBy(s -> s.startsWith("+41")));
        case "uk": return list.stream().collect(Collectors.groupingBy(s -> s.startsWith("+44")));
        default:   return null;
    }
}

并称之为:

List<String> ukNums = countryMap(list,"uk").get(true);
List<String> chNums = countryMap(list,"ch").get(true);

有人可以告诉我应该如何做到最好——也许不用一直延长开关块?我想要类似的东西:

List<String> ukNums = countryMap(list).get("uk");
4

1 回答 1

2

如果您定义一种getCountryFromPhone方法,您可以使用您目前使用的 groupingBy 方法按国家/地区对电话号码进行分组:

Map<String, List<String>> groupedPhones = list.stream().collect(Collectors.groupingBy(s -> getCountryFromPhone(s)));

然后您可以按照您想要的方式获取英国电话号码:groupedPhones.get("uk")

现在,它getCountryFromPhone看起来像什么?它应该返回电话号码的国家代码,因此以下内容适用于初学者。

static Map<String,String> phoneMap = Map.of(
    "+49", "de",
    "+43", "at",
    "+41", "ch",
    "+44", "uk");

private static String getCountryFromPhone(String s) {
    return phoneMap.getOrDefault(s.substring(0, 3), "unknown");
}

稍后,您可能需要添加对具有不同长度的电话国家代码的国家/地区的支持。这不是一件小事,有像libphonenumber这样的库可以帮助解决这个问题。您只需getCountryFromPhone在库中调用适当的方法即可。

于 2020-03-31T22:52:01.630 回答