給出描述的n個節點,求其鄰居節點以及判斷兩個節點是否有直接聯絡
阿新 • • 發佈:2019-01-05
具體描述: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); }
以上就是這篇文章的主要內容。歡迎各位提出意見。讓我們一起學習進步!