java - 如何对在号码前面或中间包含括号、+ 和 - 的国际电话号码进行排序
问题描述
这是一道面试题。假设我有如下国际电话号码列表,我想按升序或降序对它们进行排序。
+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
谁能帮我逻辑
解决方案
您可以使用 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 是因为要对数字进行排序,必须删除所有非数字字符。但是,由于要求保持格式相同,因此解决方案是去除非数字字符,对它们进行排序,然后使用它们指向原始数字字符串。
推荐阅读
- numpy - 为什么 Pandas 的 isin() 不能与 numpy.int64 一起使用?
- c++ - 在节点插件中添加两个字符串参数
- sql - 来自单个列的 StardDate 和 EndDate
- .net - 当您的读取和写入具有相似的扩展要求时,CQRS 是否仍然有用?
- java - 为什么我的 Java 变量需要以这种方式实现?
- qt - 在 pyqt5 中使用默认信号发出的参数
- c# - 从 Task<(string,object)> 转换为 Task
- css - className 情绪会被删除
- react-native - 反应原生生命周期,在useEffect中循环
- c# - 我可以在新的 ClaimTypes.Role 中使用多个角色名称吗