地鐵售票系統app實現
Dijkstra類
package com.example.subwayticke;
import java.util.*;
public class Dijkstra {
public static int calculateShortestPath(Graph graph, Station start, Station end) {
// 距離表,記錄從起點到每個站點的最短距離
Map<Station, Integer> distances = new HashMap<>();
// 優先隊列,按距離排序
PriorityQueue<Station> queue = new PriorityQueue<>(Comparator.comparingInt(distances::get));
// 初始化距離表
for (Station station : graph.getAdjacencyList().keySet()) {
distances.put(station, Integer.MAX_VALUE);
}
distances.put(start, 0); // 起點到自身的距離為0
queue.add(start);
// Dijkstra算法主循環
while (!queue.isEmpty()) {
Station current = queue.poll();
// 如果找到終點,返回距離(不包括起點站)
if (current.equals(end)) {
return distances.get(current) - 1; // 減去起點站
}
// 遍歷當前站點的所有相鄰站點
for (Station neighbor : graph.getNeighbors(current)) {
int newDistance = distances.get(current) + 1; // 每站距離為1
if (newDistance < distances.get(neighbor)) {
distances.put(neighbor, newDistance);
queue.add(neighbor);
}
}
}
// 如果沒有找到路徑,返回-1
return -1;
}
}
Graph類
package com.example.subwayticke;
import java.util.*;
public class Graph {
private Map<Station, List
public Graph() {
adjacencyList = new HashMap<>();
}
public void addStation(Station station) {
adjacencyList.putIfAbsent(station, new ArrayList<>());
}
public void addConnection(Station station1, Station station2) {
adjacencyList.get(station1).add(station2);
adjacencyList.get(station2).add(station1);
}
public List<Station> getNeighbors(Station station) {
return adjacencyList.getOrDefault(station, new ArrayList<>());
}
public Map<Station, List<Station>> getAdjacencyList() {
return adjacencyList;
}
}
Line類
package com.example.subwayticke;
import java.util.*;
public class Line {
private String name;
private List
public Line(String name, List<Station> stations) {
this.name = name;
this.stations = stations;
}
public String getName() {
return name;
}
public List<Station> getStations() {
return stations;
}
}
MainActivity類
package com.example.subwayticke;
import android.os.Bundle;
import android.view.View;
import android.widget.;
import androidx.appcompat.app.AppCompatActivity;
import java.util.;
public class MainActivity extends AppCompatActivity {
private Spinner startStationSpinner;
private Spinner endStationSpinner;
private EditText ticketQuantityEditText;
private Button buyTicketButton;
private TextView resultTextView;
private List<Line> lines;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startStationSpinner = findViewById(R.id.startStationSpinner);
endStationSpinner = findViewById(R.id.endStationSpinner);
ticketQuantityEditText = findViewById(R.id.ticketQuantityEditText);
buyTicketButton = findViewById(R.id.buyTicketButton);
resultTextView = findViewById(R.id.resultTextView);
initializeLines();
setupSpinners();
setupBuyTicketButton();
}
private void initializeLines() {
lines = new ArrayList<>();
// 1號線
List<Station> line1Stations = Arrays.asList(
new Station("西王站", "1號線"),
new Station("時光街站", "1號線"),
new Station("長城橋站", "1號線"),
new Station("和平醫院站", "1號線"),
new Station("烈士陵園站", "1號線"),
new Station("新百廣場站", "1號線"),
new Station("解放廣場站", "1號線"),
new Station("平安大街站", "1號線"),
new Station("北國商城站", "1號線"),
new Station("博物院站", "1號線"),
new Station("體育場站", "1號線"),
new Station("北宋站", "1號線"),
new Station("談固站", "1號線"),
new Station("朝暉橋站", "1號線"),
new Station("白佛站", "1號線"),
new Station("留村站", "1號線"),
new Station("火炬廣場站", "1號線"),
new Station("石家莊東站", "1號線"),
new Station("南村站", "1號線"),
new Station("蛟河大道站", "1號線"),
new Station("西莊站", "1號線"),
new Station("東莊站", "1號線"),
new Station("會展中心站", "1號線"),
new Station("商務中心站", "1號線"),
new Station("園博園站", "1號線"),
new Station("福澤站", "1號線")
);
lines.add(new Line("1號線", line1Stations));
// 2號線
List<Station> line2Stations = Arrays.asList(
new Station("柳辛莊站", "2號線"),
new Station("莊窠 - 鐵道大學站", "2號線"),
new Station("義堂站", "2號線"),
new Station("建和橋站", "2號線"),
new Station("長安公園站", "2號線"),
new Station("北國商城站", "2號線"),
new Station("裕華路站", "2號線"),
new Station("槐中路站", "2號線"),
new Station("歐韻公園站", "2號線"),
new Station("元村站", "2號線"),
new Station("石家莊站", "2號線"),
new Station("塔壇站", "2號線"),
new Station("倉豐路留村站", "2號線"),
new Station("南位站", "2號線"),
new Station("嘉華路站", "2號線")
);
lines.add(new Line("2號線", line2Stations));
// 3號線
List<Station> line3Stations = Arrays.asList(
new Station("西三莊站", "3號線"),
new Station("高柱站", "3號線"),
new Station("柏林莊站", "3號線"),
new Station("市莊站", "3號線"),
new Station("市二中站", "3號線"),
new Station("新百廣場站", "3號線"),
new Station("東里站", "3號線"),
new Station("槐安橋站", "3號線"),
new Station("西三教站", "3號線"),
new Station("石家莊站", "3號線"),
new Station("匯通路站", "3號線"),
new Station("孫村站", "3號線"),
new Station("塔冢站", "3號線"),
new Station("東王站", "3號線"),
new Station("南王站", "3號線"),
new Station("位同站", "3號線"),
new Station("東二環南路站", "3號線"),
new Station("西仰陵站", "3號線"),
new Station("中仰陵站", "3號線"),
new Station("南豆站", "3號線"),
new Station("太行南大街站", "3號線"),
new Station("樂鄉站", "3號線")
);
lines.add(new Line("3號線", line3Stations));
}
private void setupSpinners() {
List<Station> allStations = new ArrayList<>();
for (Line line : lines) {
allStations.addAll(line.getStations());
}
StationAdapter adapter = new StationAdapter(this, allStations);
startStationSpinner.setAdapter((SpinnerAdapter) adapter);
endStationSpinner.setAdapter((SpinnerAdapter) adapter);
}
private void setupBuyTicketButton() {
buyTicketButton.setOnClickListener(v -> {
Station startStation = (Station) startStationSpinner.getSelectedItem();
Station endStation = (Station) endStationSpinner.getSelectedItem();
int quantity = Integer.parseInt(ticketQuantityEditText.getText().toString());
int price = TicketCalculator.calculatePrice(startStation, endStation, lines);
int totalPrice = price * quantity;
resultTextView.setText("購票成功!總價:" + totalPrice + "元");
});
}
}
Station類
package com.example.subwayticke;
import java.util.Objects;
public class Station {
private String name;
private String line;
public Station(String name, String line) {
this.name = name;
this.line = line;
}
public String getName() {
return name;
}
public String getLine() {
return line;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Station station = (Station) obj;
return name.equals(station.name) && line.equals(station.line);
}
@Override
public int hashCode() {
return Objects.hash(name, line);
}
@Override
public String toString() {
return name + " (" + line + ")";
}
}
StationAdapter類
package com.example.subwayticke;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import java.util.List;
public class StationAdapter extends ArrayAdapter
public StationAdapter(Context context, List<Station> stations) {
super(context, android.R.layout.simple_spinner_item, stations);
setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView view = (TextView) super.getView(position, convertView, parent);
view.setText(getItem(position).getName());
return view;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
TextView view = (TextView) super.getDropDownView(position, convertView, parent);
view.setText(getItem(position).getName());
return view;
}
}
TicketCalculator類
package com.example.subwayticke;
import java.util.*;
public class TicketCalculator {
public static int calculatePrice(Station start, Station end, List<Line> lines) {
// 構建地鐵圖
Graph graph = buildGraph(lines);
// 計算最少站數(不包括起點站)
int stationCount = Dijkstra.calculateShortestPath(graph, start, end);
if (stationCount == -1) {
return -1; // 如果沒有找到路徑,返回-1
}
// 每3站收費1元,不足3站按1元收費
int price = (int) Math.ceil(stationCount / 3.0);
return Math.max(price, 1); // 至少收費1元
}
private static Graph buildGraph(List<Line> lines) {
Graph graph = new Graph();
// 添加所有站點
for (Line line : lines) {
for (Station station : line.getStations()) {
graph.addStation(station);
}
}
// 添加連接
for (Line line : lines) {
List<Station> stations = line.getStations();
for (int i = 0; i < stations.size() - 1; i++) {
graph.addConnection(stations.get(i), stations.get(i + 1));
}
}
// 添加換乘連接
Map<String, List<Station>> stationMap = new HashMap<>();
for (Line line : lines) {
for (Station station : line.getStations()) {
stationMap.putIfAbsent(station.getName(), new ArrayList<>());
stationMap.get(station.getName()).add(station);
}
}
for (List<Station> stations : stationMap.values()) {
if (stations.size() > 1) { // 換乘站
for (int i = 0; i < stations.size(); i++) {
for (int j = i + 1; j < stations.size(); j++) {
graph.addConnection(stations.get(i), stations.get(j));
}
}
}
}
return graph;
}
}
activity_main.xml代碼
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="起點站"
android:textSize="18sp"
android:layout_marginBottom="8dp" />
<Spinner
android:id="@+id/startStationSpinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="終點站"
android:textSize="18sp"
android:layout_marginBottom="8dp" />
<Spinner
android:id="@+id/endStationSpinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="購票數量"
android:textSize="18sp"
android:layout_marginBottom="8dp" />
<EditText
android:id="@+id/ticketQuantityEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="請輸入購票數量"
android:inputType="number"
android:layout_marginBottom="16dp" />
<Button
android:id="@+id/buyTicketButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="立即購票"
android:textSize="18sp"
android:layout_marginBottom="16dp" />
<TextView
android:id="@+id/resultTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="18sp"
android:gravity="center"
android:text="購票結果將顯示在這里" />

浙公網安備 33010602011771號