1. 程式人生 > >給出描述的n個節點,求其鄰居節點以及判斷兩個節點是否有直接聯絡

給出描述的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);
	}

以上就是這篇文章的主要內容。歡迎各位提出意見。讓我們一起學習進步!