具体描述: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);
}
以上就是这篇文章的主要内容。欢迎各位提出意见。让我们一起学习进步!