数字化婚姻配对尝试:建立一个模型,来模拟推导社会男女择偶过程。
1、100个男方,顺序,轮流从0号到99号女方中挑选自己最满意的一 位,然后向她发出配对邀请。
2、接受邀请最多的女方开始行动,对这些邀请的男性中,选择最满意 的一位。
3、那么这两位配对成功,剔除出样本,剩下的99对继续这样配对。
4、循环该配对法则,直到最后一对男女配对成功。
思路:
- 先确定存储的数据类型:可以确定的一点该题对数据的遍历远远大于修改(要一遍遍去匹配),故对于原始数据的存储用ArrayList(底层数据结构为数组)。
- 建立Person类:结合题目以及给的文件可以确定有七个属性,分别为ID, 样貌,品格,财富 , 期望样貌,期望品格,期望财富。主角样本的id为性别另外区别。
- 读取并存储:从给的文件来看,一行一行读取并写入到集合当中去。从题目要求看每次选出对象后主角要移除,原本数据要恢复。所以要另外创立两个集合来存储原始数据。
- 算法分析:
1).从主角样本中拿到主角,并根据id加入到对应的样本中去
2).男生开始根据自己的要求选择一位女生(可以是任何女士,但只能选择一位)。若两位女生得分相同,则看女生的样貌,品格,财富总值谁高选谁;在男生选女生的同时统计有哪些女生被选过且有多少男生选择她。
3).统计哪位女生被男生选择的次数最多(即为最受欢迎的女生)。
4).最受欢迎的女生在选择自己的男生里选择一位男生。选择标准:得分最高(若分数一样则看前三项加起来的值,若值还一样则比较id,选id较小的)
5).若择偶成功的一对里面包含主角则匹配成功,然后从样本中剔除主角,原本数据恢复。反之,在男女集合中剔除这两个人,继续上面的步骤直到长度最小的集合 - 把主角一个个拿去匹配并打印出结果。
具体实现:
Person实现类:
package com.tulun.people;
import lombok.*;
/**
* @author:liguozheng
* @Date:2018/10/24
* @time:17:01
* @description:
*/
@NoArgsConstructor
@AllArgsConstructor
@Setter
@Getter
@ToString
public class Person {
private int id; //ID
private int appearance ; //样貌
private int treasure ; //品格
private int character ; //财富
private int appearanceLook; //样貌期望
private int treasureLook; // 品格期望
private int characterLook; //财富期望
}
工具类Run:
package com.tulun.main;
import com.tulun.people.Person;
import java.io.*;
import java.util.*;
/**
* @author:liguozheng
* @Date:2018/10/24
* @time:21:46
* @description:
*/
@SuppressWarnings("all")
public class Run <K,V>{
private ArrayList<Person> maleList;
private ArrayList<Person> femaleList;
private ArrayList<Person> playersList;
private ArrayList<Person> man ;
private ArrayList<Person> mon ;
int id;
public Run(String malePath,String femalePath,String playersPath) throws IOException {
this.mon = new <Person>ArrayList();
this.man = new <Person>ArrayList();
this.maleList = new <Person>ArrayList();
this.femaleList = new <Person>ArrayList();
this.playersList = new<Person> ArrayList();
this.mon.addAll(saveCount(femalePath));
this.man.addAll(saveCount(malePath));