3月14日总结
今天完成了地铁售票的APP构建,并连接到手机利用手机运行,具体代码如下:
MainActivity类实现功能
package com.example.testdemo;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
private Spinner startSpinner, endSpinner;
private EditText quantityInput;
private TextView resultText;
private Map<String, List<String>> lineStations = new HashMap<>(); // 各线路站点数据
private Map<String, List<String>> stationLines = new HashMap<>(); // 站点所属线路
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化UI组件
startSpinner = findViewById(R.id.spinner_start);
endSpinner = findViewById(R.id.spinner_end);
quantityInput = findViewById(R.id.et_quantity);
Button buyButton = findViewById(R.id.btn_buy);
resultText = findViewById(R.id.tv_result);
// 初始化地铁线路数据
initMetroData();
// 获取所有站点名称(去重)
List<String> allStations = new ArrayList<>(stationLines.keySet());
Collections.sort(allStations); // 按字母排序
// 设置Spinner适配器
ArrayAdapter<String> adapter = new ArrayAdapter<>(
this, android.R.layout.simple_spinner_item, allStations
);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
startSpinner.setAdapter(adapter);
endSpinner.setAdapter(adapter);
// 购票按钮点击事件
buyButton.setOnClickListener(v -> calculateTicketPrice());
}
// 初始化地铁线路和站点数据
private void initMetroData() {
// 地铁1号线
List<String> line1 = Arrays.asList(
"西王", "时光街", "长城桥", "和平医院", "烈士陵园", "新百广场", "解放广场",
"平安大街", "北国商城", "博物院", "北宋", "谈固", "朝晖桥", "白佛", "火炬广场",
"石家庄东站", "南村", "洨河大道", "西庄", "东庄", "会展中心", "商务中心", "园博园", "福泽"
);
lineStations.put("1号线", line1);
// 地铁2号线
List<String> line2 = Arrays.asList(
"柳辛庄站", "庄窠铁道大学站", "义堂站", "建和桥站", "长安公园站", "北国商城",
"裕华路站", "槐中路站", "欧韵公园站", "元村站", "石家庄站", "塔坛站",
"仓丰路留村站", "南位站", "嘉华路站"
);
lineStations.put("2号线", line2);
// 地铁3号线
List<String> line3 = Arrays.asList(
"西三庄", "高柱", "柏林庄", "市庄", "市二中", "新百广场", "东里", "槐安桥",
"西三教", "石家庄站", "汇通路", "孙村", "塔冢", "东王", "南王", "位同",
"东二环南路", "西仰陵", "中仰陵", "南豆", "太行南大街", "乐乡"
);
lineStations.put("3号线", line3);
// 构建站点-线路映射关系
for (Map.Entry<String, List<String>> entry : lineStations.entrySet()) {
String line = entry.getKey();
for (String station : entry.getValue()) {
if (!stationLines.containsKey(station)) {
stationLines.put(station, new ArrayList<>());
}
stationLines.get(station).add(line);
}
}
}
// 计算票价
private void calculateTicketPrice() {
String start = startSpinner.getSelectedItem().toString();
String end = endSpinner.getSelectedItem().toString();
String quantityStr = quantityInput.getText().toString();
if (quantityStr.isEmpty()) {
showResult("请输入购票数量");
return;
}
int quantity = Integer.parseInt(quantityStr);
if (quantity <= 0) {
showResult("购票数量必须大于0");
return;
}
// 获取站点所属线路
List<String> startLines = stationLines.get(start);
List<String> endLines = stationLines.get(end);
if (startLines == null || endLines == null) {
showResult("无效站点");
return;
}
// 检查是否同一线路
List<String> commonLines = new ArrayList<>(startLines);
commonLines.retainAll(endLines);
int totalStations = 0;
if (!commonLines.isEmpty()) {
// 同一线路直接计算
totalStations = getStationsSameLine(start, end, commonLines.get(0));
} else {
// 跨线路换乘计算
totalStations = getStationsWithTransfer(start, end, startLines, endLines);
if (totalStations == -1) {
showResult("无法换乘");
return;
}
}
// 计算费用(每3站1元,向上取整)
int price = (int) Math.ceil(totalStations / 3.0) * quantity;
showResult("购票成功!总金额:" + price + "元");
}
// 同一线路计算站数
private int getStationsSameLine(String start, String end, String line) {
List<String> stations = lineStations.get(line);
int startIdx = stations.indexOf(start);
int endIdx = stations.indexOf(end);
return Math.abs(endIdx - startIdx); // 直接返回站数差
}
// 跨线路换乘计算
private int getStationsWithTransfer(String start, String end,
List<String> startLines, List<String> endLines) {
int minStations = Integer.MAX_VALUE;
// 遍历所有可能的换乘站
for (String sLine : startLines) {
for (String eLine : endLines) {
List<String> sStations = lineStations.get(sLine);
List<String> eStations = lineStations.get(eLine);
// 查找换乘站
for (String station : sStations) {
if (eStations.contains(station)) {
int st1 = getStationsSameLine(start, station, sLine);
int st2 = getStationsSameLine(station, end, eLine);
int total = st1 + st2;
if (total < minStations) {
minStations = total;
}
}
}
}
}
return minStations == Integer.MAX_VALUE ? -1 : minStations;
}
private void showResult(String msg) {
resultText.setText(msg);
}
}
activity_main.xml前端页面
<!-- activity_main.xml -->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<!-- 起点站 -->
<TextView
android:text="起点站"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Spinner
android:id="@+id/spinner_start"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<!-- 终点站 -->
<TextView
android:text="终点站"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"/>
<Spinner
android:id="@+id/spinner_end"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<!-- 购票数量 -->
<TextView
android:text="购票数量"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"/>
<EditText
android:id="@+id/et_quantity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="number"/>
<!-- 购票按钮 -->
<Button
android:id="@+id/btn_buy"
android:text="立即购票"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"/>
<!-- 结果显示 -->
<TextView
android:id="@+id/tv_result"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:textSize="18sp"/>
</LinearLayout>
效果如下:

学习进度表
| 第6天 | 第7天 | 第8天 | 第9天 | 第10天 | |
|---|---|---|---|---|---|
| 所花时间(包括上课) | 3 | 3 | 4 | 5 | 3 |
| 代码量(行) | 300+ | 200+ | 200+ | 200+ | 300+ |
| 博客量(篇) | 1 | 1 | 1 | 1 | 1 |
| 了解到的知识点 | CSS以及JavaSrcipt的知识 | JavaSrcipt以及Android Studio | Android Studio配置以及虚拟机 | Android Studio连接数据库 | Android Studio构建手机APP |
浙公网安备 33010602011771号