githubの住所:https://github.com/anarkhwqh/Subway
データ処理
これは、円形の経路、始点と同じ局の端末局である場合、次のようにtxtファイルに道路名とサイト名を横切る鉄道線は、形式は次のとおりです。
1号线 苹果园 古城 八角游乐园········四惠 四惠东
2号线 西直门 积水潭 鼓楼大街········车公庄 西直门
·
·
·
S1线 石厂 小园 栗园庄············ 四道桥 金安桥
ファイル機能を読みます
public void loadSubwayFile(String subway_file) {
BufferedReader reader = null;
File subway = new File(subway_file);
try {
reader = new BufferedReader(new FileReader(subway));
String t = null;
while ((t = reader.readLine()) != null) {
List<String> line = Arrays.asList(t.split(" "));
station.add(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
格納された地下鉄の各行、リストとして保存し、各配列に行と、List<List<String>>
によってステーションMap<String, Integer> name_num
数、各地下鉄駅
public void mapping() {
int cnt = 1;
for (List<String> line : station) {
//因为下标为0的都为线路名称,所以i从1开始
for (int i = 1; i < line.size(); i++) {
if (!name_num.containsKey(line.get(i))) {
num_name.put(cnt, line.get(i));
name_num.put(line.get(i), cnt++);
}
}
}
}
ショーよるCNT数、332地下鉄の駅の合計
ダイクストラの道順
ダイクストラ
private static int[][] c = new int[500][500];
//存储地铁站连通情况,c[i][j]等于1表示两站相邻,等于0表示不相邻
private static int[] prev = new int[500];
//存储最短路径
private static int[] dist = new int[500];
//存储最短距离
private static boolean[] s = new boolean[500];
//记录某点是否遍历过
private static int n = 332;
//总站点数
void Dijkstra(int v) {
Arrays.fill(s, false);
Arrays.fill(prev, 0);
for (int i = 1; i <= n; i++) {
dist[i] = c[v][i];
if (dist[i] != 999999)
prev[i] = v;
}
dist[v] = 0;
s[v] = true;
for (int i = 2; i <= n; i++) {
int tmp = 999999;
int u = v;
for (int j = 1; j <= n; j++) {
if ((!s[j]) && dist[j] < tmp) {
u = j;
tmp = dist[j];
}
}
s[u] = true;
for (int j = 1; j <= n; j++) {
if (dist[u] + c[u][j] < dist[j]) {
dist[j] = dist[u] + c[u][j];
prev[j] = u;
} else if (dist[u] + c[u][j] == dist[j]) {
int a = searchPath(v, u);
int b = searchPath(v, prev[j]);
if (u != j && a < b) {
if (a < b)
prev[j] = u;
else {
for (List<String> line : station) {
if (line.contains(num_name.get(u)) && line.contains(num_name.get(j)))
prev[j] = u;
}
}
}
}
}
}
}
上記においてmapping()
機能するためにc[][]
初期化します
for (int i = 1; i < line.size(); i++) {
if (i != 1) {
int a = name_num.get(line.get(i));
int b = name_num.get(line.get(i - 1));
c[a][b] = c[b][a] = 1;
}
}
SearchPathの
int searchPath(int v, int u) {
int[] que = new int[500];
int cnt = 0;//换乘次数
int tot = 1;
que[tot] = u;
tot++;
int tmp = prev[u];
while (tmp != v) {
que[tot] = tmp;
tot++;
tmp = prev[tmp];
}
que[tot] = v;
for (int i = tot; i >= 1; i--) {
boolean f = false;
if (i == tot)
f = true;
else if (i != 1) {
for (List<String> line : station) {
if (line.contains(num_name.get(que[i + 1])) && line.contains(num_name.get(que[i - 1]))) {
f = true;
break;
}
}
}
if (i != 1 && !f) {
cnt++;
}
}
return cnt;
}
UIインターフェイス
直接JavaでUIを書かれたページやアプリのno形式、などの比較的シンプルなインターフェース
サンプルテスト
- 長いルート
- 重複路線
- 出発点または終了点のエラーを入力します。
- 開始と終了が同じです
#欠損とATと結論づけ
地下鉄マップ疎なグラフであり、ダイクストラのアルゴリズムが密グラフの、しかしにより少ないメトロポイントに適しているので、速度が速くなります。自体はその後、エリア拡大の部分が、選択地下鉄駅では、マップをドラッグしますが、実装されていないことができ、エリアをクリック、購入時に地下鉄の駅でのページに似た決定的な答えを試してみたいの可視化が続きます。JavaでUIインターフェイスを書くときに解決する問題ではありませんでした、適切なサイズに調整した画像を入れて歪みが常に非常に深刻です、私は解決する方法がわかりません。最後に、個々の割り当て、非効率的、官僚冒頭のために、非常に頻繁にバグがコードを書くの過程で思考内容の一部は、バグをバック調整に時間がかかるにつながる、包括されていないです。