引言
最近,一位女子吐槽软卧车厢分配三男一女,引发了网友的热议。有人认为,这是对女性的不尊重和不安全,应该取消或改进软卧车厢的分配机制;有人认为,这是正常的随机分配,没有必要大惊小怪,只要保证车厢内的秩序和卫生就行。那么,软卧车厢的分配究竟是如何实现的呢?作为程序员的我,看到这个事件后,首先想到的是软卧车厢分配的技术实现。本文将简单分享我的看法,如有错误,敬请指正。
技术实现
首先,我们假设一个车厢4个床位,路线有a、b、c、d四个站点,甲乙丙均为同一性别,丁为异性,每隔一个站点100票价,全程400,甲要求车厢内全部同性。
买票的时候提供一个选项,是否不接受异性同车厢,根据这个选项进行判断,如果选择是,那么需要支付四个床位的车票费用,也就是甲需要支付1200购买。
如果分配到的车厢有同性乘客乙从a点上车c点下车,那么相应减去乙乘客从b到c的差价,也就是说这时乘客甲只需支付1100购买。
在以上情况的前提下,中途c点丙上车到d点下车,计算c到d这部分差价,如果甲在app下单,则通过app自动退还差价,如果在车站下单那就到下车点凭身份证到窗口退钱。甲下车退还100,实际支付1000。
假设乙丙没有选择该服务,则系统根据车厢是否有选择了该服务的乘客为判断依据进行优先级排序和判断,也就是说在甲下车前该车厢只能分配给甲相同性别的且中途同一性别下单优先分配到该车厢。
如果这趟车所有软卧车厢都有一位要求同性别的乘客‘甲’,那么丁将无法购买到本次列车的软卧,只能选择硬座或其它班次。此外,考虑到研发成本等多方面因素,选择该服务需要支付额外服务费。
代码示例
package com.java;
import java.util.ArrayList;
import java.util.List;
// 定义车厢类
public class Carriage {
// 定义车厢属性
private List<Passenger> beds; // 四个床位,初始为空
private int[] arrive; // 四个床位终点
private int serviceFee; // 选择不接受异性同车厢的服务费
// 构造方法
public Carriage() {
this.beds = new ArrayList<Passenger>(4); // 初始化为0
beds.add(0, new Passenger());
beds.add(1, new Passenger());
beds.add(2, new Passenger());
beds.add(3, new Passenger());
this.arrive = new int[4]; // 初始化为0
this.serviceFee = 100;
}
// 定义购票方法
public void buyTicket(Passenger passenger) {
// 获取第一个空床位的索引
int index = indexOf(beds);
// 判断是否有空床位
if (index != -1) {
// 判断是否选择了不接受异性同车厢的服务
if (passenger.getOption().equals("yes")) {
// 分配空床位
beds.set(index, passenger);
// 分配床位终点
arrive[index] = passenger.getEnd();
// 判断是否第一个床位,如果不是,计算其它床位费用
int diff = 0;
if (index > 0) {
for (int i = 0; i < index; i++) {
diff += (arrive[i] - passenger.getStart()) * 100;
}
}
// 支付四个床位的车票费用和服务费
passenger.pay(((passenger.getEnd() - passenger.getStart()) * 100) * 4 - diff + serviceFee);
System.out.println(passenger.getName() + "选择了不接受异性同车厢的服务,分配到了" + (index + 1) + "号床位,支付了" +
((passenger.getEnd() - passenger.getStart()) * 100 * 4 - diff + serviceFee) + "元。");
} else {
// 判断是否有同性乘客已经选择了不接受异性同车厢的服务
boolean isItNot = false;
for (int i = 0; i < 4; i++) {
if (beds.get(i).getGender() != passenger.getGender() && beds.get(i).getOption() != null && beds.get(i).getOption().equals("yes")) {
isItNot = true;
break;
}
}
if (!isItNot) {
// 分配空床位
beds.set(index, passenger);
// 分配床位终点
arrive[index] = passenger.getEnd();
// 支付单个床位的车票费用
passenger.pay((passenger.getEnd() - passenger.getStart()) * 100);
System.out.println(passenger.getName() + "没有选择不接受异性同车厢的服务,分配到了"
+ (index + 1) + "号床位,支付了" + ((passenger.getEnd() - passenger.getStart()) * 100) + "元。");
// 计算是否需要退还差价给已经选择了不接受异性同车厢的服务的乘客
for (Passenger bed : beds) {
if (bed.getGender() == passenger.getGender() && bed.getOption().equals("yes")) {
// 计算差价
int diff = 0;
if (passenger.getEnd() > bed.getEnd()) {
diff = (bed.getEnd() - passenger.getStart()) * 100;
} else {
diff = (passenger.getEnd() - passenger.getStart()) * 100;
}
// 退还差价
bed.setRefund(bed.getRefund() + diff);
System.out.println("因为" + passenger.getName() + "加入了车厢,退还了" + bed.getName() + diff + "元差价。");
}
}
} else {
System.out.println(passenger.getName() + "没有选择不接受异性同车厢的服务,但是有异性乘客已经选择了该服务,无法购买。");
}
}
} else {
System.out.println(passenger.getName() + "没有空床位,无法购买。");
}
}
// 定义下车方法
public void getOff(Passenger passenger) {
// 判断是否在该车厢内
if (beds.contains(passenger)) {
// 获取床位号
int index = beds.indexOf(passenger);
// 清空床位
beds.set(index, null);
// 判断是否需要退还服务费
if (passenger.getOption().equals("yes")) {
// 退还差价
passenger.refund(passenger.getRefund());
System.out.println(passenger.getName() + "下车,退还了" + passenger.getRefund() + "元。");
} else {
System.out.println(passenger.getName() + "下车。");
}
} else {
System.out.println(passenger.getName() + "不在该车厢内。");
}
}
// 定义一个辅助方法,返回数组中某个元素的索引,如果不存在则返回-1
public int indexOf(List<Passenger> array) {
for (int i = 0; i < array.size(); i++) {
if (array.get(i).getName() == null) {
return i;
}
}
return -1;
}
}
package com.java;
// 定义乘客类
public class Passenger {
// 定义乘客属性
private String name; // 姓名
private int gender; // 性别,1为男性,-1为女性
private String option; // 是否不接受异性同车厢,yes或no
private int start; // 上车站点,a为1,b为2,c为3,d为4
private int end; // 下车站点,a为1,b为2,c为3,d为4
private int refund; // 退还的差价
// 构造方法
public Passenger(String name, int gender, String option, int start, int end) {
this.name = name;
this.gender = gender;
this.option = option;
this.start = start;
this.end = end;
this.refund = 0;
}
public Passenger() {
}
// 定义支付方法
public void pay(int amount) {
System.out.println(name + "支付了" + amount + "元。");
}
// 定义退款方法
public void refund(int amount) {
System.out.println(name + "退还了" + amount + "元。");
}
// 定义获取姓名的方法
public String getName() {
return name;
}
// 定义获取性别的方法
public int getGender() {
return gender;
}
// 定义获取选项的方法
public String getOption() {
return option;
}
// 定义获取上车站点的方法
public int getStart() {
return start;
}
// 定义获取下车站点的方法
public int getEnd() {
return end;
}
public int getRefund() {
return refund;
}
public void setRefund(int refund) {
this.refund = refund;
}
}
package com.java;
public class Demo {
// 定义主方法
public static void main(String[] args) {
// 创建一个车厢对象
Carriage carriage = new Carriage();
// 创建一些乘客对象
Passenger p1 = new Passenger("张三", 1, "yes", 2, 4); // 张三是男性,要求不接受异性同车厢,从b点到d点
Passenger p2 = new Passenger("李四", 1, "no", 1, 3); // 李四是男性,没有要求不接受异性同车厢,从a点到c点
Passenger p3 = new Passenger("王五", 1, "no", 3, 4); // 王五是男性,没有要求不接受异性同车厢,从c点到d点
Passenger p4 = new Passenger("赵六", -1, "no", 1, 4); // 赵六是女性,没有要求不接受异性同车厢,从a点到d点
// 调用购票方法
carriage.buyTicket(p2); // 李四购票成功,支付了200元。
carriage.buyTicket(p1); // 张三购票成功,支付了800元。
carriage.buyTicket(p3); // 王五购票成功,支付了100元,退还了张三100元差价。
carriage.buyTicket(p4); // 赵六购票失败,因为有异性乘客已经选择了不接受异性同车厢的服务
// 调用下车方法
carriage.getOff(p2); // 李四下车
carriage.getOff(p4); // 赵六不在该车厢内
carriage.getOff(p1); // 张三下车,退还100元
}
}
运行结果如下:
李四支付了200元。
李四没有选择不接受异性同车厢的服务,分配到了1号床位,支付了200元。
张三支付了800元。
张三选择了不接受异性同车厢的服务,分配到了2号床位,支付了800元。
王五支付了100元。
王五没有选择不接受异性同车厢的服务,分配到了3号床位,支付了100元。
因为王五加入了车厢,退还了张三100元差价。
赵六没有选择不接受异性同车厢的服务,但是有异性乘客已经选择了该服务,无法购买。
李四下车。
赵六不在该车厢内。
张三退还了100元。
张三下车,退还了100元。
总结
以上就是我对软卧车厢分配技术实现的简单分析。从技术角度来看,并不复杂。但是从社会角度来看,则涉及到很多复杂而又敏感的问题。比如:
- 是否应该尊重乘客对于同性别或异性别的偏好?
- 是否应该区分男女对于安全感和舒适感的需求?
- 是否应该收取额外的服务费来提供这种服务?
- 是否会引发性别歧视或者性别隔离的争议?
这些问题没有简单的答案,需要我们从多个角度和层面来思考和讨论。我希望我的文章能够给您带来一些启发和思考,也欢迎您在评论区留下您的看法和建议。谢谢您的阅读。