算法主体
public class Main {
public static void main(String[] args) {
//初始化男性
ManPerson Alex = new ManPerson("Alex",0,new int[]{0,3,2,1},false);
ManPerson Bob = new ManPerson("Bob",1,new int[]{0,1,2,3},false);
ManPerson Chris = new ManPerson("Chris",2,new int[]{1,3,2,0},false);
ManPerson David = new ManPerson("David",3,new int[]{2,0,1,3},false);
//初始化女性
WomanPerson Ada = new WomanPerson("Ada",0,new int[]{1,2,0,3},false);
WomanPerson Becky = new WomanPerson("Becky",1,new int[]{0,3,2,1},false);
WomanPerson Cindy = new WomanPerson("Cindy",2,new int[]{3,0,2,1},false);
WomanPerson Diana = new WomanPerson("Diana",3,new int[]{2,1,3,0},false);
ManPerson[] boys = {Alex,Bob,Chris,David};
WomanPerson[] girls = {Ada,Becky,Cindy,Diana};
int i = 0;
//当至少有一个男性没结婚,则循环所有男性
while(!boys[0].is_marry || !boys[1].is_marry || !boys[2].is_marry||!boys[3].is_marry){
if(i==4)i=0;//如果超出循环范围则重新循环
ManPerson cur_boy = boys[i];//得到当前求婚男性
if(!cur_boy.is_marry){//如果当前男的没结婚
int girl_num = cur_boy.rank[cur_boy.rank_num];//获取求婚男的最喜欢的女的编号
WomanPerson cur_girl = girls[girl_num];//获取求婚男最喜欢的女生
if(!cur_girl.is_marry){//如果当前男的最喜欢的女生没有结婚则求婚成功
System.out.println(cur_boy.name+"向"+cur_girl.name+"求婚成功!");
cur_boy.marryPerson =cur_girl;//结婚,求婚男结婚对象改成当前女的
cur_girl.marry_person=cur_boy;//女的结婚对象改成男的
cur_girl.marry_num=i;//女的结婚对象编号改成男的编号
cur_boy.is_marry=true;//男的是否结婚变为真
cur_girl.is_marry=true;//女的是否结婚变为真
cur_boy.rank_num++;//男的喜欢的列表排名人指针往后移,为了被绿后还能再选下一个
}
else {//如果当前男的最喜欢的女的结婚了
if(cur_girl.rank[cur_girl.marry_num] < cur_girl.rank[i]){//如果当前女的结婚对象比当前求婚对象排名高,则求婚失败
System.out.println(cur_boy.name+"向"+cur_girl.name+"求婚失败!");//求婚失败
cur_boy.rank_num++;//如果当前求婚对象没有结婚对象排名高,则当前男求婚对象喜欢的列表指针往后移,对下一个人进行求婚
continue;//继续选择下一个人进行求婚
}
else {//如果当前求婚对象比结婚对象排名高
System.out.println(cur_boy.name+"向"+cur_girl.name+"求婚成功!");//求婚成功
cur_girl.marry_person.is_marry=false;//当前女的结婚对象被绿,男的是否结婚变为假
System.out.println(cur_girl.marry_person.name+"和"+cur_girl.name+"离婚!");
cur_girl.marry_person.marryPerson =null;//离婚男没有结婚对象了
cur_girl.marry_person=cur_boy;//当前女的结婚对象变为求婚对象
cur_girl.marry_num=i;//当前女的结婚对象编号变为求婚对象编号
cur_boy.marryPerson =cur_girl;//求婚成功男结婚对象编号改成当前女的
cur_boy.is_marry=true;//求婚男的是否结婚变为真
cur_girl.is_marry=true;//当前女结婚为真
cur_boy.rank_num++;//求婚成功男喜欢列表指针+1,被绿后可以找下一个
}
}
}
i++;//循环下一个男性
}
System.out.println("最终结果:");
for (ManPerson boy : boys) {
System.out.println(boy.name+" ❤ "+ boy.marryPerson.name);
}
}
}