首页 > 解决方案 > 如何对在号码前面或中间包含括号、+ 和 - 的国际电话号码进行排序

问题描述

这是一道面试题。假设我有如下国际电话号码列表,我想按升序或降序对它们进行排序。

+91-9618229418
+1(608) 666-555
+1(408) 666-555
(308) 666-555

所以例外的结果是

(308) 666-555
+1(408) 666-555
+1(608) 666-555
+91-9618229418

谁能帮我逻辑

标签: javadata-structures

解决方案


您可以使用 TreeMap。

 public static void main(String args[])
    {
        TreeMap<Long, String> sorted = new TreeMap<>();
        String[] numbers = {"+91-9618229418",
                "+1(608) 666-555",
                "+1(408) 666-555",
                "(308) 666-555"};

        for (int i = 0; i < numbers.length; i++){
            long number = Long.parseLong(numbers[i].replaceAll("[^0-9]", ""));
            sorted.put(number, numbers[i]);
        }
        for(Map.Entry<Long,String> entry : sorted.entrySet()) {
            System.out.println(entry.getValue());
        }
    }

最终结果是

(308) 666-555
+1(408) 666-555
+1(608) 666-555
+91-9618229418

原因:TreeMap 是一种排序映射,它要么基于自然排序(这里使用的排序,因为我们只是按值对数字进行排序)要么使用提供的比较器进行排序。

我选择 TreeMap 是因为要对数字进行排序,必须删除所有非数字字符。但是,由于要求保持格式相同,因此解决方案是去除非数字字符,对它们进行排序,然后使用它们指向原始数字字符串。


推荐阅读