3.17
package com.example.subway;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private Spinner spStartStation, spEndStation;
private EditText etTicketCount;
private Button btnBuyTicket;
private TextView tvResult;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化控件
spStartStation = findViewById(R.id.spStartStation);
spEndStation = findViewById(R.id.spEndStation);
etTicketCount = findViewById(R.id.etTicketCount);
btnBuyTicket = findViewById(R.id.btnBuyTicket);
tvResult = findViewById(R.id.tvResult);
// 获取所有站点列表
List<String> allStations = MetroData.getAllStations();
// 创建适配器并设置给起点站和终点站的Spinner
ArrayAdapter<String> stationAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, allStations);
stationAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spStartStation.setAdapter(stationAdapter);
spEndStation.setAdapter(stationAdapter);
// 立即购票按钮点击事件
btnBuyTicket.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 获取用户输入
String startStation = spStartStation.getSelectedItem().toString();
String endStation = spEndStation.getSelectedItem().toString();
String ticketCountStr = etTicketCount.getText().toString().trim();
// 检查输入是否为空
if (ticketCountStr.isEmpty()) {
Toast.makeText(MainActivity.this, "请填写购票数量", Toast.LENGTH_SHORT).show();
return;
}
int ticketCount = Integer.parseInt(ticketCountStr);
// 计算总站数
int totalStations = MetroData.calculateTotalStations(startStation, endStation);
if (totalStations == -1) {
tvResult.setText("无效的起点站或终点站");
return;
}
// 计算票价
int price = (totalStations + 2) / 3;
int totalPrice = price * ticketCount;
// 显示结果
tvResult.setText("购票成功!总票价:" + totalPrice + "元");
}
});
}
}
package com.example.subway;
import java.util.*;
public class MetroData {
private static final Map<String, List
private static final Map<String, List
static {
// 1号线站点
List<String> line1Stations = new ArrayList<>();
line1Stations.add("福泽");
line1Stations.add("园博园");
line1Stations.add("商务中心");
line1Stations.add("会展中心");
line1Stations.add("东庄");
line1Stations.add("西庄");
line1Stations.add("洨河大道");
line1Stations.add("南村");
line1Stations.add("石家庄东站");
line1Stations.add("火炬广场");
line1Stations.add("留村");
line1Stations.add("朝晖桥");
line1Stations.add("谈固");
line1Stations.add("北宋");
line1Stations.add("体育中心");
line1Stations.add("博物院");
line1Stations.add("平安大街");
line1Stations.add("解放广场");
line1Stations.add("新百广场");
line1Stations.add("烈士陵园");
line1Stations.add("时光街");
line1Stations.add("长城桥");
line1Stations.add("和平医院");
line1Stations.add("西王");
LINE_STATIONS.put("1号线", line1Stations);
// 2号线站点
List<String> line2Stations = new ArrayList<>();
line2Stations.add("柳辛庄");
line2Stations.add("庄窠铁道大学");
line2Stations.add("义堂");
line2Stations.add("建和桥");
line2Stations.add("长安公园");
line2Stations.add("北国商城");
line2Stations.add("平安大街");
line2Stations.add("解放广场");
line2Stations.add("东广场");
line2Stations.add("欧韵公园");
line2Stations.add("槐中路");
line2Stations.add("新世隆");
line2Stations.add("塔谈");
line2Stations.add("塔谈南");
line2Stations.add("南位");
line2Stations.add("仓丰路留村");
line2Stations.add("嘉华路");
LINE_STATIONS.put("2号线", line2Stations);
// 3号线站点
List<String> line3Stations = new ArrayList<>();
line3Stations.add("西三庄");
line3Stations.add("高柱");
line3Stations.add("柏林庄");
line3Stations.add("市庄");
line3Stations.add("二中");
line3Stations.add("新百广场");
line3Stations.add("东里");
line3Stations.add("槐安桥");
line3Stations.add("西三教");
line3Stations.add("石家庄站");
line3Stations.add("汇通路");
line3Stations.add("孙村");
line3Stations.add("塔冢");
line3Stations.add("东王");
line3Stations.add("南王");
line3Stations.add("位同");
line3Stations.add("东二环南路");
line3Stations.add("西仰陵");
line3Stations.add("中仰陵");
line3Stations.add("南豆");
line3Stations.add("太行南大街");
line3Stations.add("乐乡");
LINE_STATIONS.put("3号线", line3Stations);
// 构建站点连接图
for (List<String> stations : LINE_STATIONS.values()) {
for (int i = 0; i < stations.size(); i++) {
String station = stations.get(i);
STATION_CONNECTIONS.computeIfAbsent(station, k -> new ArrayList<>());
if (i > 0) {
STATION_CONNECTIONS.get(station).add(stations.get(i - 1));
}
if (i < stations.size() - 1) {
STATION_CONNECTIONS.get(station).add(stations.get(i + 1));
}
}
}
}
// 获取所有站点
public static List<String> getAllStations() {
List<String> allStations = new ArrayList<>();
for (List<String> stations : LINE_STATIONS.values()) {
allStations.addAll(stations);
}
return allStations;
}
// 计算总站数
public static int calculateTotalStations(String startStation, String endStation) {
if (!STATION_CONNECTIONS.containsKey(startStation) || !STATION_CONNECTIONS.containsKey(endStation)) {
return -1;
}
Queue<String> queue = new LinkedList<>();
Set<String> visited = new HashSet<>();
Map<String, Integer> distance = new HashMap<>();
queue.offer(startStation);
visited.add(startStation);
distance.put(startStation, 0);
while (!queue.isEmpty()) {
String currentStation = queue.poll();
if (currentStation.equals(endStation)) {
return distance.get(currentStation);
}
for (String neighbor : STATION_CONNECTIONS.get(currentStation)) {
if (!visited.contains(neighbor)) {
queue.offer(neighbor);
visited.add(neighbor);
distance.put(neighbor, distance.get(currentStation) + 1);
}
}
}
return -1;
}
}
package com.example.subway;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/calculate")
public class CalculateFareServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
request.setCharacterEncoding("UTF-8"); // 设置请求编码
response.setCharacterEncoding("UTF-8"); // 设置响应编码
try {
// 获取参数
// 修改后的代码
String startName = request.getParameter("startStation").trim(); // 去除空格
String endName = request.getParameter("endStation").trim();
int quantity = Integer.parseInt(request.getParameter("quantity"));
// 输出起点站和终点站名称
System.out.println("输入的起点站名称: [" + startName + "]");
System.out.println("输入的终点站名称: [" + endName + "]");
// 验证站点有效性
int startCode = SubwayLine.getStationCode(startName);
int endCode = SubwayLine.getStationCode(endName);
if (startCode == -1 || endCode == -1) {
request.setAttribute("error", "输入的站点不存在!");
request.getRequestDispatcher("/index.jsp").forward(request, response);
return;
}
// 计算站数(起点不算)
int totalStations = Math.abs(endCode - startCode);
if (totalStations == 0) {
request.setAttribute("error", "起点站和终点站不能相同!");
request.getRequestDispatcher("/index.jsp").forward(request, response);
return;
}
// 根据收费原则计算票价
// 更清晰的计算方式
int fare = (totalStations / 3) + (totalStations % 3 > 0? 1 : 0);
int totalCost = fare * quantity;
request.setAttribute("result", String.format("购票成功!票价:%d元 × %d张 = 总金额:%d元", fare, quantity, totalCost));
} catch (NumberFormatException e) {
request.setAttribute("error", "购票数量必须为正整数!");
} catch (Exception e) {
request.setAttribute("error", "系统错误:" + e.getMessage());
}
try {
request.getRequestDispatcher("/index.jsp").forward(request, response);
} catch (Exception e) {
response.sendError(500, "服务器内部错误");
}
}
}
package com.example.subway;
import java.util.HashMap;
import java.util.Map;
public class SubwayLine {
// 石家庄地铁站点名称-编号映射
private static final Map<String, Integer> STATIONS = new HashMap<>();
static {
// 石家庄地铁1号线站点
STATIONS.put("西王站", 1);
STATIONS.put("时光街站", 2);
STATIONS.put("长城桥站", 3);
STATIONS.put("和平医院站", 4);
STATIONS.put("烈士陵园站", 5);
STATIONS.put("新百广场站", 6);
STATIONS.put("解放广场站", 7);
STATIONS.put("平安大街站", 8);
STATIONS.put("北国商城站", 9);
STATIONS.put("博物院站", 10);
STATIONS.put("体育场站", 11);
STATIONS.put("建和桥站", 12);
STATIONS.put("朝晖桥站", 13);
STATIONS.put("白佛站", 14);
STATIONS.put("留村站", 15);
STATIONS.put("火炬广场站", 16);
STATIONS.put("石家庄东站", 17);
STATIONS.put("南村站", 18);
STATIONS.put("洨河大道站", 19);
STATIONS.put("西庄站", 20);
STATIONS.put("东庄站", 21);
STATIONS.put("会展中心站", 22);
STATIONS.put("行政中心站", 23);
STATIONS.put("园博园站", 24);
STATIONS.put("福泽站", 25);
// 石家庄地铁2号线站点
STATIONS.put("柳辛庄站", 101);
STATIONS.put("庄窠·铁道大学站", 102);
STATIONS.put("义堂站", 103);
STATIONS.put("建和桥北站", 104);
STATIONS.put("长安公园站", 105);
STATIONS.put("北国商城站", 106); // 与1号线换乘
STATIONS.put("大戏院站", 107);
STATIONS.put("新世隆站", 108);
STATIONS.put("裕华路站", 109);
STATIONS.put("槐中路站", 110);
STATIONS.put("欧韵公园站", 111);
STATIONS.put("元村站", 112);
STATIONS.put("塔坛站", 113);
STATIONS.put("石家庄站", 114);
STATIONS.put("南位站", 115);
STATIONS.put("嘉华路站", 116);
// 石家庄地铁3号线站点
STATIONS.put("西三庄站", 201);
STATIONS.put("水上公园站", 202);
STATIONS.put("柏林庄站", 203);
STATIONS.put("市庄站", 204);
STATIONS.put("市二中站", 205);
STATIONS.put("新百广场站", 206); // 与1号线换乘
STATIONS.put("东里站", 207);
STATIONS.put("槐安桥站", 208);
STATIONS.put("西三教站", 209);
STATIONS.put("石家庄站", 210); // 与2号线换乘
STATIONS.put("汇通路站", 211);
STATIONS.put("孙村站", 212);
STATIONS.put("塔冢站", 213);
STATIONS.put("东王站", 214);
STATIONS.put("南王站", 215);
STATIONS.put("位同站", 216);
STATIONS.put("东二环南路站", 217);
STATIONS.put("西仰陵站", 218);
STATIONS.put("中仰陵站", 219);
STATIONS.put("南豆站", 220);
STATIONS.put("太行南大街站", 221);
STATIONS.put("乐乡站", 222);
}
/**
* 根据站点名称获取站点编号
*
* @param name 站点名称
* @return 站点编号,如果不存在返回-1
*/
public static int getStationCode(String name) {
return STATIONS.getOrDefault(name, -1);
}
/**
* 获取所有站点名称
*
* @return 所有站点名称
*/
public static String[] getAllStationNames() {
return STATIONS.keySet().toArray(new String[0]);
}
}

浙公网安备 33010602011771号