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
posted @ 2025-03-14 18:38  阿伟·  阅读(26)  评论(0)    收藏  举报