-4

私は今日この質問をしましたが、答えは私の問題を解決するのに役立ちませんでした. 私は更新されたものでもう一度尋ねることができ、うまくいけば私の問題を解決できると思いました。

Q が X に隣接していること、R が X に隣接していること (また)、P が R に隣接していることなどを示すにはどうすればよいですか? テキストファイル

Q   X
R   X
P   R
P   W
W   S
S   T
T   W
W   Y
Y   R
Y   Z

したがって、画面に出力されます:

Q is adjacent to X
R is adjacent to X
P is adjacent to R (tab or spaces) W
etc etc etc

ファイルを読み取り、それらを 2 つの異なる ListArray に格納するコードのセグメント

    while (theFlightFile.hasNext()) {
        String cityFrom = theFlightFile.next();
        String cityTo = theFlightFile.next();
        City cityA = new City(cityFrom);
        City cityB = new City(cityTo);

        cityToList.add(cityA);
        cityFromList.add(cityB);
        //testing input reading...
        //System.out.println(cityFrom + " -----> " + cityTo);
    }

/**
 * Displays to the screen, a list of all cities served by the airline
 * along with the names of cities to which each is adjacent.
 */
public void displayFlightMap() {
    int i = 0;
    while (!cityStack.isEmpty() && topCity.equals(destinationCity)) {
        displayAdjacentCities(cityFromList.get(i));
        i++;
    }
}

/**
 * Displays to the screen, the names of all cities which are are adjacent
 * to aCity; aCity is assumed to be a valid city served by the airline.
 * @param aCity The city for which the adjacency list is desired.
 */
public void displayAdjacentCities(City aCity) {
    String str = "";
    for (City cityA : cityToList) {
        for (City cityB : cityFromList) {
            if (cityA != cityB) {
                str = cityA + " is adjacent to " + cityB;
            }
        }
        System.out.println(str);
    }
}

表示されるのは、cityToList が 10 回印刷され、すべて「Z」に隣接していると表示されているように見えるものです。

4

2 に答える 2

1

@trama
興味がある場合は、を使用した実装を次に示しますHashMap

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;

public class TestAdj {

    HashMap<String, ArrayList<String>> map;


    public TestAdj() {
        BufferedReader br = null;

        try {
            br = new BufferedReader(new FileReader("input.txt"));
            map = new HashMap<String, ArrayList<String>>();
            String line = null;
            while ((line = br.readLine()) != null) {
                String[] set = line.split("\t");
                if (map.containsKey(set[0])) {
                    map.get(set[0]).add(set[1]);
                } else {
                    ArrayList lst = new ArrayList<String>();
                    lst.add(set[1]);
                    map.put(set[0], lst);
                }
            }
        } catch (Exception ex) {
            Logger.getLogger(TestAdj.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                br.close();
            } catch (IOException ex) {
                Logger.getLogger(TestAdj.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public void displayAdj() {
        Object[] sources=map.keySet().toArray();

        for (int i = 0; i < sources.length; i++) {
            System.out.print(sources[i]+" -->");
            System.out.println(map.get(sources[i]));
        }
    }

    public static void main(String[] args) {
        new TestAdj().displayAdj();
    }
}
于 2013-04-21T06:49:05.867 に答える
-1

リストを保存するためにある種のマップを使用してみてはどうでしょうか?

// Storing the cities:
HashMap<City, LinkedList<City>> cityList = new HashMap<City, LinkedList<City>>();
String cityFrom = theFlightFile.next();
String cityTo = theFlightFile.next();
City cityA = new City(cityFrom);
City cityB = new City(cityTo);

LinkedList<City> currentFollowers;
if (!cityList.containsKey(cityA)) {
     currentFollowers = new LinkedList<City>();
     cityList.put(cityA, currentFollowers);
} else {
     currentFollowers = cityList.get(cityA);
}

currentFollowers.add(cityB);
cityList.put(cityA, currentFollowers);

// For the output you could still use a String:
public void displayAdjacentCities(City aCity) {
     String output = aCity + " is adjacent to";
     for(City cityTo : cityList.get(aCity)) {
          output += " " + cityTo;
     }
     System.out.println(output);
}

// and your displayFlightMap-Method could look like:    
for(City from : cityList.keySet()) {
    displayAdjacentCities(from);
}
于 2013-04-21T06:56:14.170 に答える