地铁售票系统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="购票结果将显示在这里" />