给出描述的n个节点,求其邻居节点以及判断两个节点是否有直接联系

具体描述:txt文件中存储n个节点直接的联系,形如1,2表示节点1和节点2直接联系,或者说他们是邻居。有很多组这样的数据,要求将这些节点读出来进行存储。然后实现输入节点号,输出它的邻居节点。以及输入两个节点ID号,判断他们是否直接相连。

分布解析这个题目要求。1、先读取txt文件中的数据,用ArrayList<Integer[]>将每一行数据存储下来。然后给这些数据构建数据关系。去读这个ArrayList中的数据,我们要根据节点的ID号去找它的邻居。根据关键字去找指定的数据。在Java中可以使用HashMap<Key, Value>这样的存储结构来存储。将每个节点的ID号当作Key,它的邻居节点组当作Value,但是考虑到这个节点的邻居有多个,所以我们使用HashSet进行存储。即存储数据的结构可认为是:HashMap<Integer, HashSet<Integer>>。

参考代码如下:

public static HashMap<Integer, HashSet<Integer>> 
	                      getRelationMap(ArrayList<Integer[]> dataList){
		
		HashMap<Integer, HashSet<Integer>>  relationMap =
				new HashMap<Integer, HashSet<Integer>>();
		int i = 0;
		Integer[] intArray = null;
		Integer nodeID1 = 0;
		Integer nodeID2 = 0;
		for(i = 0; i < dataList.size(); i ++) {
			intArray = dataList.get(i);
			nodeID1 = intArray[0];
			nodeID2 = intArray[1];
			constructRelationMap(relationMap, nodeID1, nodeID2);
			constructRelationMap(relationMap, nodeID2, nodeID1);
		}
		return relationMap;
	}
	private static void 
	constructRelationMap(HashMap<Integer, HashSet<Integer>>  relationMap,
			Integer nodeID1, Integer nodeID2) {
		HashSet<Integer> tmpSet = null;
		if(!relationMap.containsKey(nodeID1)) {
			tmpSet = new HashSet<Integer>();
			tmpSet.add(nodeID2);
			relationMap.put(nodeID1, tmpSet);
		}else {
			tmpSet = relationMap.get(nodeID1);
			tmpSet.add(nodeID2);
		}
	}
	public static ArrayList<Integer[]> getData(String fileName) throws IOException{
		ArrayList<Integer[]> dataList = new ArrayList<Integer[]>();
		File file = new File(fileName);
		BufferedReader reader = new BufferedReader(new FileReader(file));
		String tempString = null;
		String[] strArray = null;
		Integer[] intArray = null;
		while ((tempString = reader.readLine()) != null) {
			strArray = tempString.split(",");
			intArray = new Integer[]{Integer.parseInt(strArray[0]),
					Integer.parseInt(strArray[1])};
			dataList.add(intArray);
		}
		reader.close();
		return dataList;
	}

2、实现要求的两个功能,只要根据上面对数据的存储方式,根据HashMap键值对的特征去查找即可。参考代码如下:

private static void getNeighbors(HashMap<Integer, HashSet<Integer>> relationMap,
			Integer nodeID1) {
		System.out.print(nodeID1 + "'s neighbors are:");
		HashSet<Integer> myset = relationMap.get(nodeID1);
		Iterator<Integer> it = myset.iterator();
		Integer neighborID = 0;
		while(it.hasNext()) {
			neighborID = it.next();
			System.out.print(neighborID + ",");
		}
		System.out.println();
	}
	
	public static boolean isNodeConnected(HashMap<Integer, HashSet<Integer>> relationMap,
			Integer nodeID1, Integer nodeID2) {
		return relationMap.get(nodeID1).contains(nodeID2);
	}


以上就是这篇文章的主要内容。欢迎各位提出意见。让我们一起学习进步!


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值