HIT软件构造 1.对Lab1 P3客户端的设计与思考
程序员文章站
2024-02-09 18:14:52
...
首先,看一下题目相关要求:
题目要求创建一个描述社交网络的无向图,在每对朋友之间都构建两条边;即A和B为朋友,则存在两条有向边,A→B和B→A。在查询两个人之间关系的时候,如果两个人之间不相连,则输出-1;如果查询自己和自己的关系,则显示0;其他情况返回两个人之间的最短距离。
利用两个类来完成题目要求,Person类用以保留个人信息,FriendshipGraph类用以构建关系网,在构建过程中会考虑到名字重复问题,但是在构建客户端的时候,存在用户的输入,就需要考虑到更多问题:
(1)何时输入结束?
(2)如何将输入的名字和特定的人联系到一起?
(3)输入朋友之间关系没有输入两个人怎么办?
(4)输入的名字不存在怎么办?
先看一下整体代码:
public static void main(String[] args) {
// TODO 自动生成的方法存根
FriendshipGraph graph = new FriendshipGraph();
HashMap<String, Person> peopleHashMap = new HashMap<>();
System.out.println("请输入所有人的名字(以空格分隔):");
Scanner input = new Scanner(System.in);
String line = input.nextLine();
String []nameStrings = line.split(" ");
for(String personName : nameStrings) {
Person person = new Person(personName);
peopleHashMap.put(personName, person);
graph.addVertex(person);
}
System.out.println("请输入朋友关系(每次输入两个名字,两个朋友之间用空格分隔,输入over结束):");
while(true) {
line = input.nextLine();
if(line.equals("over")) break;
String[] friendStrings = line.split(" ");
if(friendStrings.length != 2) {
System.out.println("输入错误,请重新输入:");
continue;
}
if(!peopleHashMap.containsKey(friendStrings[0])) {
System.out.println("对不起,没有查询到叫"+friendStrings[0]+"的人,请重新输入:");
continue;
}
if(!peopleHashMap.containsKey(friendStrings[1])) {
System.out.println("对不起,没有查询到叫"+friendStrings[1]+"的人,请重新输入:");
continue;
}
graph.addEdge(peopleHashMap.get(friendStrings[0]), peopleHashMap.get(friendStrings[1]));
graph.addEdge(peopleHashMap.get(friendStrings[1]), peopleHashMap.get(friendStrings[0]));
}
System.out.println("请输入要查询的关系(每次输入两个名字,两个人之间用空格分隔,输入over结束):");
while(true) {
line = input.nextLine();
if(line.equals("over")) break;
String[] friendStrings = line.split(" ");
if(friendStrings.length != 2) {
System.out.println("输入错误,请重新输入:");
continue;
}
if(!peopleHashMap.containsKey(friendStrings[0])) {
System.out.println("对不起,没有查询到叫"+friendStrings[0]+"的人,请重新输入:");
continue;
}
if(!peopleHashMap.containsKey(friendStrings[1])) {
System.out.println("对不起,没有查询到叫"+friendStrings[1]+"的人,请重新输入:");
continue;
}
System.out.println(friendStrings[0]+"和"+friendStrings[1]+"之间的距离为:"+
graph.getDistance(peopleHashMap.get(friendStrings[0]), peopleHashMap.get(friendStrings[1])));
}
}
下面依次解决上述问题:
(1)对于输入人数不确定,可以提示用户一次性输入所有名字,用空格分隔,再利用
String []nameStrings = line.split(" ");
将名字提取到字符串数组中, 再对每一个名字创建一个 Person对象:
for(String personName : nameStrings) {
Person person = new Person(personName);
peopleHashMap.put(personName, person);
graph.addVertex(person);
}
(2)考虑到本题假设名字和人之间是一一对应的关系,则可以利用HashMap,讲名字作为Key,将人作为Value,就可以根据名字查找到对应的人:
HashMap<String, Person> peopleHashMap = new HashMap<>();
peopleHashMap.put(personName, person);
graph.addEdge(peopleHashMap.get(friendStrings[0]), peopleHashMap.get(friendStrings[1]));
graph.addEdge(peopleHashMap.get(friendStrings[1]), peopleHashMap.get(friendStrings[0]));
(3)对于输入两个人关系的时候,也利用问题一中介绍的空格分隔的方式读入名字,如果字符数组的长度不是2,则说明输入的人数不是2,会打印错误,要求重新输入:
line = input.nextLine();
if(line.equals("over")) break;
String[] friendStrings = line.split(" ");
if(friendStrings.length != 2) {
System.out.println("输入错误,请重新输入:");
continue;
}
(4)在问题二中已经解决了姓名和人一对一的问题,则可以在后续的操作中在HashMap中查找姓名,如果查找不到这个Key,则说明输入的姓名有误,打印错误后要求重新输入:
if(!peopleHashMap.containsKey(friendStrings[0])) {
System.out.println("对不起,没有查询到叫"+friendStrings[0]+"的人,请重新输入:");
continue;
}
if(!peopleHashMap.containsKey(friendStrings[1])) {
System.out.println("对不起,没有查询到叫"+friendStrings[1]+"的人,请重新输入:");
continue;
}
下一篇: STIL中的Spec