だから私はコンマで区切られた一度に1行で読むこの割り当てを持っています。
Atlanta, Philadelphia
New York, Philadelphia
Philadelphia, Chicago
Washington, Florida
.....
up to a vast amount.. (I don't know the amount)
各線は 2 つの場所の間の接続を表します (たとえば、アトランタはフィラデルフィアに接続します)。接続されたノードと接続されていないノードを作成します。たとえば、ワシントンとフロリダは互いに接続されていますが、他には接続されていません。
プログラムが行うことになっているのは、ファイルを読み取り、2 つの都市の引数を指定すると、接続されている場合は [はい]、接続されていない場合は [いいえ] を吐き出すことです。
プログラムを終了し、動作しますが、効率的ではありません。私は何ができるのか途方に暮れています。これは、コードを非効率にするプログラムの一部です。
この最初の入力でファイルが読み取られるため、さまざまな都市のリストのサイズを判断できます。また、重複する都市はすべて削除されます。
private static void createCityList() throws IOException{
try {
FileReader a = new FileReader(file);
BufferedReader br = new BufferedReader(a);
String line;
line = br.readLine();
while(line != null){
StringTokenizer st = new StringTokenizer(line, ",");
while(st.hasMoreTokens()){
String currentToken = st.nextToken();
if(!cityList.contains(currentToken.trim())){
cityList.add(currentToken.trim());
}//if
}//while hasMoreTokens
line = br.readLine();//read the next line
}//while line != null
br.close();
}//try
catch (FileNotFoundException e) {
e.printStackTrace();
}
length = cityList.size(); // set length to amount of unique cities
}//createCityList
別のファイル読み取りを行う2番目の方法...隣接行列を作成できます
private static void graph() throws IOException{
cityGraph = new int[cityList.size()][cityList.size()];
try {
FileReader a = new FileReader(file);
BufferedReader br = new BufferedReader(a);
String line;
line = br.readLine();
while(line != null){
StringTokenizer st = new StringTokenizer(line, ",");
while(st.hasMoreTokens()){
String firstToken = st.nextToken().trim();
String secondToken = st.nextToken().trim();
cityGraph[cityList.indexOf(firstToken)][cityList.indexOf(secondToken)] = 1;
cityGraph[cityList.indexOf(secondToken)][cityList.indexOf(firstToken)] = 1;
}//while hasMoreTokens
line = br.readLine();//read the next line
}//while line != null
br.close();
}//try
catch (FileNotFoundException e) {
e.printStackTrace();
}//catch
}//graph
最後に、2 つの都市で DFS を実行して、接続されているかどうかを判断します。
private static void isConnected(String s1, String s2){
city1 = cityList.indexOf(s1); //set city to the index of s1 or s2 in the cityList LinkedList.
city2 = cityList.indexOf(s2);
int startNode = city1;
q.add(startNode); // start node
while(!q.isEmpty()){
//visit vertex
for(int i = 0; i < length; i++){
if(cityGraph[startNode][i] == 1){
if( i == city2 ){
System.out.println("yes");
return;
}//if city2 found
q.add(i);
cityGraph[startNode][i] = 0; //Set to visited
}//if vertex exist
}//for
q.remove();//remove the top element and start with new node
if(!q.isEmpty()){
startNode = (Integer) q.element();
}//if
}//while q is not empty
System.out.println("no");
}//isConnected
私は 1 つのファイルのみを読み取ろうとしていますが、ファイルを読み取ってサイズがわかった後でのみ、未知のサイズからマトリックスを作成する際に問題が発生しています。どんな助けや提案も大歓迎です!