初次尝试建立Android软件

建立Android软件前的准备:安装Android studio(JDK已安装)
安装Android studio的教程在网络很多,很容易查到。
安装后,添加新项目,语言选择java。
在java文件夹里创建:
Station.java:
public class Station {
private String name;
private List lines;

public Station(String name) {
    this.name = name;
    this.lines = new ArrayList<>();
}

public String getName() {
    return name;
}

public void addLine(String line) {
    if (!lines.contains(line)) {
        lines.add(line);
    }
}

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Station station = (Station) o;
    return name.equals(station.name);
}

@Override
public int hashCode() {
    return name.hashCode();
}

}

Line.java:
public class Line {
private String name;
private List stations;

public Line(String name) {
    this.name = name;
    this.stations = new ArrayList<>();
}

public void addStation(Station station) {
    stations.add(station);
    station.addLine(this.name);
}

public List<Station> getStations() {
    return stations;
}

public String getName() {
    return name;
}

}

MetroSystem.java:
import java.util.*;

public class MetroSystem {
private Map<String, Station> stations = new HashMap<>();
private List lines = new ArrayList<>();
private Map<Station, List> adjacencyList = new HashMap<>();

public void addLine(String lineName, List<String> stationNames) {
    Line line = new Line(lineName);
    List<Station> lineStations = new ArrayList<>();

    for (String name : stationNames) {
        Station station = stations.get(name);
        if (station == null) {
            station = new Station(name);
            stations.put(name, station);
        }
        station.addLine(lineName);
        line.addStation(station);
        lineStations.add(station);
    }

    lines.add(line);
    buildAdjacency(lineStations);
}

private void buildAdjacency(List<Station> stations) {
    for (int i = 0; i < stations.size(); i++) {
        Station current = stations.get(i);
        adjacencyList.putIfAbsent(current, new ArrayList<>());

        if (i > 0) {
            Station prev = stations.get(i - 1);
            adjacencyList.get(current).add(prev);
            adjacencyList.get(prev).add(current); // 双向连接
        }
    }
}

public int calculateFare(String start, String end) {
    Station startStation = stations.get(start);
    Station endStation = stations.get(end);

    if (startStation == null || endStation == null) return -1;

    int stops = bfs(startStation, endStation);
    if (stops == -1) return -1;

    return (int) Math.ceil(stops / 3.0);
}

private int bfs(Station start, Station end) {
    Queue<Station> queue = new LinkedList<>();
    Map<Station, Integer> distances = new HashMap<>();

    queue.add(start);
    distances.put(start, 0);

    while (!queue.isEmpty()) {
        Station current = queue.poll();
        if (current.equals(end)) return distances.get(current);

        for (Station neighbor : adjacencyList.getOrDefault(current, new ArrayList<>())) {
            if (!distances.containsKey(neighbor)) {
                distances.put(neighbor, distances.get(current) + 1);
                queue.add(neighbor);
            }
        }
    }
    return -1;
}

public List<String> getStationNames() {
    return new ArrayList<>(stations.keySet());
}

}

在activity_main.xml文件里:

<AutoCompleteTextView
    android:id="@+id/startStation"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="起始站"/>

<AutoCompleteTextView
    android:id="@+id/endStation"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="终点站"/>

<EditText
    android:id="@+id/ticketCount"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:inputType="number"
    android:hint="票数"/>

<Button
    android:id="@+id/calculateButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="计算费用"/>

<TextView
    android:id="@+id/result"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="18sp"/>

MainActivity.java:
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import java.util.Arrays;

public class MainActivity extends AppCompatActivity {
private MetroSystem metroSystem = new MetroSystem();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // 初始化地铁线路(示例数据)
    metroSystem.addLine("1号线", Arrays.asList("A站", "B站", "换乘站", "D站"));
    metroSystem.addLine("2号线", Arrays.asList("E站", "换乘站", "G站"));

    setupUI();
}

private void setupUI() {
    // 自动补全适配器
    ArrayAdapter<String> adapter = new ArrayAdapter<>(
            this, android.R.layout.simple_dropdown_item_1line,
            metroSystem.getStationNames()
    );

    AutoCompleteTextView startStation = findViewById(R.id.startStation);
    AutoCompleteTextView endStation = findViewById(R.id.endStation);
    startStation.setAdapter(adapter);
    endStation.setAdapter(adapter);

    Button calculateBtn = findViewById(R.id.calculateButton);
    calculateBtn.setOnClickListener(v -> calculate());
}

private void calculate() {
    String start = ((AutoCompleteTextView) findViewById(R.id.startStation)).getText().toString();
    String end = ((AutoCompleteTextView) findViewById(R.id.endStation)).getText().toString();
    String countStr = ((EditText) findViewById(R.id.ticketCount)).getText().toString();

    if (start.isEmpty() || end.isEmpty() || countStr.isEmpty()) {
        showResult("请填写所有字段");
        return;
    }

    try {
        int count = Integer.parseInt(countStr);
        int fare = metroSystem.calculateFare(start, end);
        if (fare == -1) showResult("路线不存在");
        else showResult("总金额:" + (fare * count) + "元");
    } catch (NumberFormatException e) {
        showResult("请输入有效票数");
    }
}

private void showResult(String msg) {
    ((TextView) findViewById(R.id.result)).setText(msg);
}

}

通过这个可以建立起一个非常简单的应用(仍有些内容未完成)。
然后可以通过Android studio自带的虚拟机测试,也可以连接直接WiFi到手机上,在手机上操作。

posted @ 2025-03-14 20:30  老汤姆233  阅读(15)  评论(0)    收藏  举报