欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

HIT软件构造 1.对Lab1 P3客户端的设计与思考

程序员文章站 2024-02-09 18:14:52
...

首先,看一下题目相关要求:

HIT软件构造 1.对Lab1 P3客户端的设计与思考

 HIT软件构造 1.对Lab1 P3客户端的设计与思考

        题目要求创建一个描述社交网络的无向图,在每对朋友之间都构建两条边;即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;
}