Java 实现地铁计价系统:按距离和次数计费
以下是 Java 实现的地铁计价系统:
public class MetroBillingSys {
private int[] cost; // 每站票价
private int price; // 次票售价
private int limit; // 次票可搭乘次数
private Map<Integer, Card> cards; // 存储所有地铁卡信息,key为卡号,value为卡信息对象
// 初始化系统
public MetroBillingSys(int[] cost, int price, int limit) {
this.cost = cost;
this.price = price;
this.limit = limit;
cards = new HashMap<>();
}
// 充值
public void recharge(int id, int amount) {
Card card = cards.get(id);
if (card != null) {
card.setBalance(card.getBalance() + amount);
} else {
card = new Card(id, amount);
cards.put(id, card);
}
}
// 购买次票
public boolean purchase(int id) {
Card card = cards.get(id);
if (card == null) {
return false;
}
if (card.getBalance() >= price) {
card.setBalance(card.getBalance() - price);
card.setLimit(card.getLimit() + limit);
return true;
} else {
return false;
}
}
// 乘坐地铁
public boolean commute(int id, int distance) {
Card card = cards.get(id);
if (card == null) {
return false;
}
if (card.getLimit() > 0) {
card.setLimit(card.getLimit() - 1);
return true;
} else if (card.getBalance() > 0) {
int totalCost = 0;
for (int i = 0; i < distance; i++) {
totalCost += cost[i];
}
card.setBalance(card.getBalance() - totalCost);
return true;
} else {
return false;
}
}
// 查询余额和次数
public int[] query(int id) {
Card card = cards.get(id);
if (card == null) {
return null;
}
int[] result = new int[2];
result[0] = card.getBalance();
result[1] = card.getLimit();
return result;
}
// 地铁卡信息类
private class Card {
private int id; // 卡号
private int balance; // 余额
private int limit; // 剩余次数
public Card(int id, int balance) {
this.id = id;
this.balance = balance;
this.limit = 0;
}
public int getId() {
return id;
}
public int getBalance() {
return balance;
}
public void setBalance(int balance) {
this.balance = balance;
}
public int getLimit() {
return limit;
}
public void setLimit(int limit) {
this.limit = limit;
}
}
}
该系统实现了以下功能:
- 初始化系统: 使用
MetroBillingSys(int [] cost,int price,int limit)初始化系统,其中cost数组表示每站的票价,price表示次票的售价,limit表示次票可搭乘的次数。 - 充值: 使用
recharge(int id, int amount)方法对指定卡号id的地铁卡充值amount元。 - 购买次票: 使用
purchase(int id)方法购买次票。如果卡余额足够,则购买成功,并返回true,否则返回false。 - 乘坐地铁: 使用
commute(int id,int distance)方法乘坐地铁,distance表示乘坐的距离。乘坐地铁的规则如下:- 如果乘客有次票次数,优先消耗次票,次数减 1 次。
- 如果乘客没有次票次数,则按距离计费,并扣除相应的费用。
- 如果余额不足以支付票价,仍然可以出站,但余额将扣除费用后变为负数。
- 如果余额小于等于 0,则无法乘坐地铁。
- 查询余额和次数: 使用
query(int id)方法查询指定卡号id的余额和剩余次票次数,返回一个包含余额和剩余次数的数组。
该系统使用 Map 数据结构来存储所有地铁卡的信息,方便查找和更新卡信息。Card 类封装了地铁卡的信息,包括卡号、余额和剩余次数。
使用示例:
int[] cost = {1, 2, 3, 4, 5}; // 每站票价
int price = 10; // 次票售价
int limit = 5; // 次票可搭乘次数
MetroBillingSys system = new MetroBillingSys(cost, price, limit);
// 充值卡号 100 的地铁卡 50 元
system.recharge(100, 50);
// 使用卡号 100 的地铁卡购买一张次票
system.purchase(100);
// 使用卡号 100 的地铁卡乘坐 3 站地铁
system.commute(100, 3);
// 查询卡号 100 的地铁卡余额和剩余次数
int[] queryResult = system.query(100);
System.out.println("余额:" + queryResult[0]);
System.out.println("剩余次数:" + queryResult[1]);
改进建议:
- 可以添加其他功能,例如:
- 查询历史记录
- 设置优惠政策
- 支持不同类型的卡 (例如老年卡、学生卡)
- 可以使用数据库来存储地铁卡信息,提高系统的可扩展性。
- 可以使用多线程来提高系统性能。
总结:
该 Java 实现的地铁计价系统是一个简单的示例,展示了如何使用 Java 开发一个基本的计价系统。用户可以根据实际需求进行修改和扩展。
原文地址: https://www.cveoy.top/t/topic/fXvi 著作权归作者所有。请勿转载和采集!