老师说要用map
GG
这个算法的匹配思想很简单:
就是男士从最喜欢的女士开始表白
如果女士没有被配对,就在一起,如果女士配对了,看之前配对的男士和当前的男士哪个更优
一直进行到所有人都匹配了为止
package GSFianl;
public class Quee {
public Node head;
public Node tail;
public Node pointer;
public int size;
public Quee(){
head=new Node();
tail=head;
size=0;
}
public void Add(String name)
{
Node node=new Node(name);
tail.LinkNext(node);
tail=node;
size++;
}
public void Mov()
{
head.LinkNext(head.next().next());
size--;
}
}
class Node{
Node next;
String value;
public Node()
{
}
public Node(String value){
this.value=value;
}
public void LinkNext(Node next) {
this.next = next;
}
public Node next()
{
return this.next;
}
public String value()
{
return this.value;
}
}
package GSFianl;
import java.util.*;
public class Human {
public String name;//名字
public ArrayList<String>map_expect=new ArrayList<String>();//偏好表
public String company="";//当前约会对象
public boolean isFree=true;//是否自由,初始为自由
public int rank=0;//求婚求到第几个人
//方法
public void date (String name)//与女孩配对
{
company =name;
isFree =false;
}
public void part(String name )//与女孩分手
{
company ="";
isFree =true;
rank++;
}
}
class MatchingProcessing{
public ArrayList<String> map_men;
public ArrayList<String > map_women;
public MatchingProcessing()
{
}
public void Matching()
{
map_men =new ArrayList<String>();
map_women =new ArrayList<String>();
Scanner input=new Scanner(System.in);
System.out.println("请输入对数");
int n=input.nextInt();
input.nextLine();
Human[] man=new Human[n];
for(int i=0;i<n;i++)
{
System.out.println("请输入男士的姓名");
man[i]=new Human();
man[i].name=input.nextLine();
map_men.add(man[i].name);
System.out.println("请输入男士喜爱的女士");
for(int j=0;j<n;j++)
{
String womanname=input.nextLine();
man[i].map_expect.add(womanname);
}
}
Human[] woman=new Human[n];
for(int i=0;i<n;i++)
{
System.out.println("请输入女士的姓名");
woman[i]=new Human();
woman[i].name=input.nextLine();
map_women.add(woman[i].name);
System.out.println("请输入女士喜爱的男士");
for(int j=0;j<n;j++)
{
String manname=input.nextLine();
woman[i].map_expect.add(manname);
}
}
Quee queue=new Quee();//初始化男人队列,刚开始都是自由的,男人女人的状态初始化已经在构造函数中完成了
for(int i=0;i<map_men.size();i++)
queue.Add(map_men.get(i));
while (queue.size>0)
{//存在男人m是自由的且还没对每个女人都求过婚
// 从队列头取出第一个男人名,在man数组中找到信息
String name = queue.head.next().value;
Human choosenman=new Human();//被选召的男人
for(int i=0;i<n;i++)
{
if(man[i].name==name)
{
choosenman=man[i];
break;
}
}
// 从其中意的女人名单中从高到低依次找非单身的date,此处在构造函数中保证偏好表已按照顺序排列
/*/Iterator<Map.Entry<String, Integer>> iter = choosenman.map_expect.entrySet().iterator();
String woname;
while (choosenman.map_expect.entrySet().iterator().hasNext()) {
woname = choosenman.map_expect.entrySet().iterator().next().getKey();
break;
}*/
name=choosenman.map_expect.get(choosenman.rank);
Human choosenwoman=new Human();
for(int i=0;i<n;i++)
{
if(woman[i].name.equals(name))
{
choosenwoman=woman[i];
break;
}
}
if (choosenwoman.isFree)
{//w是自由的
//(m,w)变成约会状态
choosenwoman.date(choosenman.name);
choosenman.date(choosenwoman.name);
queue.Mov();//队列维护
}
else{//
name=choosenwoman.company;
Human dateman=new Human(); //w当前与m’约会
for(int i=0;i<n;i++)
{
if(man[i].name.equals(name))
{
dateman=man[i];
break;
}
}
int choosenmanrank=0;
int datemanrank=0;
for(int i=0;i<choosenwoman.map_expect.size();i++)
if(choosenwoman.map_expect.get(i).equals(choosenman.name))
{
choosenmanrank=i;
break;
}
for(int i=0;i<choosenwoman.map_expect.size();i++)
if(choosenwoman.map_expect.get(i).equals(dateman.name))
{
datemanrank=i;
break;
}
if (choosenmanrank<datemanrank)
{
//w与m’分手
choosenwoman.part(dateman.name);
dateman.part(choosenwoman.name);
queue.Add(dateman.name); //队列维护
//w与m约会
choosenwoman.date(choosenman.name);
choosenman.date(choosenwoman.name);
queue.Mov(); //队列维护
}
else//m要找下一个女朋友
{
choosenman.rank++;
}
}
}
System.out.println("匹配结果是:");
for(int i=0;i<n;i++)
{
System.out.println(man[i].name+"男士与 "+man[i].company+"女士匹配");
}
}
}
package GSFianl;
import java.util.Map;
import java.util.Scanner;
public class MainMethod {
public static void main(String args[])
{
MatchingProcessing ma=new MatchingProcessing();
ma.Matching();
}
}