2025.3.13

学习内容:

  1. 重新搭建了一下环境
    安装JDK 2·1,配置环境变量(JAVA_HOME、PATH)
    安装IntelliJ IDEA,创建第一个Java项目

  2. Java基础语法复习

    • 变量与数据类型(基本类型、引用类型)
    • 运算符与表达式(算术、逻辑、比较运算符)
    • 流程控制语句(if-else、for、while)
      我的收获:
      成功配置Java开发环境,能独立创建并运行Java程序
      复习了Java基本语法,熟悉了变量定义、条件判断和循环结构的使用

遇到的问题
环境变量配置错误,导致java -version命令无法执行
for循环嵌套逻辑混乱
地铁查询源代码
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前端页面

<!-- 起点站 -->
<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"/>
posted @ 2025-03-13 22:07  被迫敲代码  阅读(8)  评论(0)    收藏  举报