7-11 电话号码同步(Java)文件phonebook1.txt和phonebook2.txt中有若干联系人的姓名和电话号码。请你设计一个程序,将这两个文件中的电话号码同步。(所谓同步,就是将两个文件中的电话号码合并后剔除相同的人名和电话号码。请将同步后的电话号码按照姓名拼音顺序排序后保存到文件phonebook3.txt中。) 由于目前的OJ系统暂时不能支持用户读入文件和写文件,我们编写程序从键盘输入文件中的姓名和电话号码,当输入的单词为end时,表示文件结束。将同步后的电话号码按照姓名拼音顺序排序后输出。
时间: 2024-03-10 10:45:36 浏览: 183
用JAVA编写的电话号码管理
4星 · 用户满意度95%
以下是Java实现的代码,使用了Java标准库中的`Map`和`TreeSet`来存储联系人信息和按照姓名拼音顺序排序的功能:
```java
import java.util.*;
public class Main {
// 读取文件中的姓名和电话号码,将其存储为一个Map
private static Map<String, String> readPhonebook(String filename) {
Map<String, String> phonebook = new HashMap<>();
try (Scanner scanner = new Scanner(Main.class.getResourceAsStream(filename))) {
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
String[] tokens = line.split("\\s+");
if (tokens.length == 2) {
phonebook.put(tokens[0], tokens[1]);
}
}
}
return phonebook;
}
// 将Map按照姓名拼音顺序排序,并将其转换为列表
private static List<Map.Entry<String, String>> sortPhonebook(Map<String, String> phonebook) {
List<Map.Entry<String, String>> sortedPhonebook = new ArrayList<>(phonebook.entrySet());
Collections.sort(sortedPhonebook, new Comparator<Map.Entry<String, String>>() {
@Override
public int compare(Map.Entry<String, String> e1, Map.Entry<String, String> e2) {
return Collator.getInstance(Locale.CHINESE).compare(e1.getKey(), e2.getKey());
}
});
return sortedPhonebook;
}
// 将两个电话簿合并,并去除重复的信息
private static Map<String, String> mergePhonebooks(Map<String, String> phonebook1, Map<String, String> phonebook2) {
Map<String, String> mergedPhonebook = new HashMap<>(phonebook1);
for (Map.Entry<String, String> entry : phonebook2.entrySet()) {
String name = entry.getKey();
String phone = entry.getValue();
if (!mergedPhonebook.containsKey(name) || !mergedPhonebook.get(name).equals(phone)) {
mergedPhonebook.put(name, phone);
}
}
return mergedPhonebook;
}
// 从键盘输入联系人信息,并将其存储为一个Map
private static Map<String, String> inputPhonebook() {
Map<String, String> phonebook = new HashMap<>();
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.print("请输入姓名:");
String name = scanner.nextLine();
if (name.equals("end")) {
break;
}
System.out.print("请输入电话号码:");
String phone = scanner.nextLine();
phonebook.put(name, phone);
}
return phonebook;
}
// 将电话簿写入文件
private static void writePhonebook(List<Map.Entry<String, String>> phonebook, String filename) {
try (Formatter formatter = new Formatter(filename)) {
for (Map.Entry<String, String> entry : phonebook) {
formatter.format("%s %s\n", entry.getKey(), entry.getValue());
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
// 从键盘输入联系人信息
Map<String, String> phonebook1 = inputPhonebook();
Map<String, String> phonebook2 = inputPhonebook();
// 将两个电话簿合并,并去除重复的信息
Map<String, String> mergedPhonebook = mergePhonebooks(phonebook1, phonebook2);
// 将Map按照姓名拼音顺序排序,并将其转换为列表
List<Map.Entry<String, String>> sortedPhonebook = sortPhonebook(mergedPhonebook);
// 将电话簿写入文件
writePhonebook(sortedPhonebook, "phonebook3.txt");
}
}
```
在该程序中,我们使用了`Collator`类来进行中文姓名的排序。需要注意的是,如果在Windows上运行该程序,可能会出现中文乱码的问题。为了解决这个问题,可以将控制台的编码设置为UTF-8。在命令行中,可以使用以下命令来设置控制台的编码:
```
chcp 65001
```
其中,`65001`代表UTF-8的代码页。
阅读全文