婚姻匹配题代码

1.保存嘉宾基本信息和要用到的属性


public class Person {
    private int id;
    private int appearance;
    private int character; 
    private int treasure;
    private int expectedAppearance;
    private int expectedCharacter; 
    private int expectedTreasure;
    private int gender;
    private int inviteTheNumber = 0;
    private int invitationCode;
    private int sumScores;
    public int getId() {
        return id;
    }
    public int getAppearance() {
        return appearance;
    }
    public int getCharacter() {
        return character;
    }
    public int getTreasure() {
        return treasure;
    }
    public int getExpectedAppearance() {
        return expectedAppearance;
    }
    public int getExpectedCharacter() {
        return expectedCharacter;
    }
    public int getExpectedTreasure() {
        return expectedTreasure;
    }
    public int getGender() {
        return gender;
    }
    public int getInviteTheNumber() {
        return inviteTheNumber;
    }
    public int getInvitationCode() {
        return invitationCode;
    }
    public void setInviteTheNumber(int inviteTheNumber) {
        this.inviteTheNumber = inviteTheNumber;
    }
    public void setInvitationCode(int invitationCode) {
        this.invitationCode = invitationCode;
    }
    public int getSumScores() {
        return this.getAppearance()+this.getCharacter()+this.getTreasure();
    }

    @Override
    public String toString() {
        return "Person [id=" + id + ", appearance=" + appearance + ", character=" + character + ", treasure=" + treasure
                + ", expectedAppearance=" + expectedAppearance + ", expectedCharacter=" + expectedCharacter
                + ", expectedTreasure=" + expectedTreasure + ", gender=" + gender + ", inviteTheNumber="
                + inviteTheNumber + ", invitationCode=" + invitationCode + ", sumScores=" + sumScores + "]";
    }
    public Person(int id,int appearance, int character, int treasure, int expectedAppearance, int expectedCharacter,
            int expectedTreasure,int gender) {
        super();
        this.id = id;       
        this.appearance = appearance;
        this.character = character;
        this.treasure = treasure;
        this.expectedAppearance = expectedAppearance;
        this.expectedCharacter = expectedCharacter;
        this.expectedTreasure = expectedTreasure;
        this.gender = gender;
    }
    public void setSumScores(int sumScores) {
        this.sumScores = sumScores;
    }
}

2.将嘉宾信息以Person方式存到集合里

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
 * 
 * @author THTF
 * @date 2018年7月13日
 */
public class InitalizesThePersonnelList {

        final static Pattern   P = Pattern.compile(",");// 正则表达式:按逗号分开
        /**
         * 
         * @param path
         * @param gender
         * @return
         * @throws FileNotFoundException
         */
        public HashMap<Integer,Person> initalizesTheList(String path,int gender) throws FileNotFoundException {
            Person female = null;
            // 存匹配上的字符串包装成的Person类
            HashMap<Integer,Person> strs = new HashMap<Integer, Person>();
            try {
                // 编码格式
                String encoding = "UTF-8";
                // 文件路径
                File file = new File(path);
                if (file.isFile() && file.exists()) { // 判断文件是否存在
                    // 输入流
                    InputStreamReader read = new InputStreamReader(new FileInputStream(file), encoding);// 考虑到编码格
                    BufferedReader bufferedReader = new BufferedReader(read);
                    String lineTxt = null;
                    // 读取一行
                    int j = 0;
                    while ((lineTxt = bufferedReader.readLine()) != null) {
                        getPerson(strs, female, lineTxt, gender,j++);
                    }
                    read.close();
                } else {
                    System.out.println("找不到指定的文件");
                }
            } catch (Exception e) {
                System.out.println("读取文件内容出错");
                e.printStackTrace();
            }
            return strs;
        }
        /**
         * 
         * @param path
         * @return
         * @throws FileNotFoundException
         */
    public List<Person> initalizesThePlayerslList(String path) throws FileNotFoundException {
            Person players = null;
            // 存匹配上的字符串包装成的Person类
            List<Person> strs = new ArrayList<Person>();
            try {
                // 编码格式
                String encoding = "UTF-8";
                // 文件路径
                File file = new File(path);
                if (file.isFile() && file.exists()) { // 判断文件是否存在
                    // 输入流
                    InputStreamReader read = new InputStreamReader(new FileInputStream(file), encoding);// 考虑到编码格
                    BufferedReader bufferedReader = new BufferedReader(read);
                    String lineTxt = null;
                    // 读取一行
                    while ((lineTxt = bufferedReader.readLine()) != null) {
                        getPerson(strs, players, lineTxt);
                    }
                    read.close();
                } else {
                    System.out.println("找不到指定的文件");
                }
            } catch (Exception e) {
                System.out.println("读取文件内容出错");
                e.printStackTrace();
            }
            return strs;
        }
    /**
     * 
     * @param strs
     * @param person
     * @param lineTxt
     * @param gender
     * @param n
     */
    private static void getPerson(Map<Integer,Person> strs, Person person, String lineTxt, int gender,int n) {
        Matcher m = P.matcher(lineTxt);
        int i = 0;
        boolean result = m.find();
        String[] findResult = null;
        if (result) {
            findResult = P.split(lineTxt, 7);// 按逗号分成七段
            int[] fr = new int[findResult.length];
            for (; i < findResult.length; i++) {
                fr[i] = Integer.parseInt(findResult[i]);
            }
            person = new Person(fr[0], fr[1], fr[2], fr[3], fr[4], fr[5], fr[6], gender);
            strs.put(n,person);
        }
    }
    /**
     * 
     * @param strs
     * @param person
     * @param lineTxt
     */
    private static void getPerson(List<Person> strs, Person person, String lineTxt) {
        Matcher m = P.matcher(lineTxt);
        int i = 0;
        boolean result = m.find();
        String[] findResult = null;
        if (result) {
            findResult = P.split(lineTxt, 7);// 按逗号分成七段
            int[] fr = new int[findResult.length];
            for (; i < findResult.length; i++) {
                fr[i] = Integer.parseInt(findResult[i]);
            }
            person = new Person(-1, fr[1], fr[2], fr[3], fr[4], fr[5], fr[6],fr[0]);
            strs.add(person);
        }
    }

}

3.匹配


import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

/**
 * Hello world!
 *
 */
public class App {

    public static int j = 1; // 第n组主角

    public static void main(String[] args) throws FileNotFoundException {
        double start = System.currentTimeMillis();
        InitalizesThePersonnelList init = new InitalizesThePersonnelList();
        // 初始化主角表
        List<Person> players = init.initalizesThePlayerslList("source/players.txt");
        Iterator<Person> iteratorP = players.iterator();
        while (iteratorP.hasNext()) {
            Map<Integer, Person> female = init.initalizesTheList("source/female.txt", 0);// 初始化男性表
            Map<Integer, Person> male = init.initalizesTheList("source/male.txt", 1);// 初始化女性表
            Person nextP = iteratorP.next();// 主角
            /* 主角是女嘉宾 */
            if (nextP.getGender() == 0) {
                female.put(female.size(), nextP);// 女列表里加入主角
                System.out.println(pair(female, male, j));
            }
            /* 主角是男嘉宾 */
            if (nextP.getGender() == 1) {
                male.put(male.size(), nextP);// 男列表里加入主角
                System.out.println(pair(female, male, j));
            }
            j++;
            break;
        }
        System.out.println(System.currentTimeMillis()-start);
    }


    /**
     * 描述 匹配
     * @param female
     * @param male
     * @param j
     * @return
     */
    public static String pair(Map<Integer, Person> female, Map<Integer, Person> male, int j) {
        int n = 0;
        int m = male.size()<female.size()?male.size():female.size();
        /* 开始匹配 */
        while (n < m) {
            initList(female, male); // 初始化剩下嘉宾的,邀请对象id、自身属性总和、被邀请次数
            Iterator<Map.Entry<Integer, Person>> iteratorM = male.entrySet().iterator();
            while (iteratorM.hasNext()) { // 男嘉宾开始选
                Person valueM = iteratorM.next().getValue(); // 男嘉宾
                int scores = 0; // 最满意程度(即满意度分数最大)
                Iterator<Map.Entry<Integer, Person>> iteratorF = female.entrySet().iterator();
                choose(iteratorF, valueM, scores); // 一位男嘉宾从女嘉宾里选择自己最满意的
                int id = valueM.getInvitationCode(); // 男嘉宾匹配的满意度最高的女嘉宾id
                Iterator<Map.Entry<Integer, Person>> iterator = female.entrySet().iterator();
                while (iterator.hasNext()) { // 该女嘉宾被选择次数+1
                    Person next = iterator.next().getValue();
                    if (next.getId() == id) {
                        next.setInviteTheNumber(next.getInviteTheNumber() + 1);
                    }
                }
            }
            int max = 0;
            max = maximum(female); // 统计被邀请最多女嘉宾的次数
            List<Person> invitedWomen = new ArrayList<Person>(); // 被选次数最多的女嘉宾们
            invitedWomen = chosenMost(invitedWomen, female, max);
            Iterator<Person> iteratorW = invitedWomen.iterator();
            Person woman = null; // 反选的女嘉宾
            woman = chosenWoman(iteratorW, woman); // 找出反选的女嘉宾
            HashMap<Integer, Person> men = new HashMap<Integer, Person>();// 选择该女嘉宾的男嘉宾们
            Iterator<Map.Entry<Integer, Person>> iteratorMan = male.entrySet().iterator();
            invitedMen(iteratorMan, men, woman);    //找到被反选的男嘉宾们
            int scores = 0;
            Iterator<Entry<Integer, Person>> iteratorMan2 = men.entrySet().iterator();
            choose(iteratorMan2, woman, scores);// 女方从男方里选择最满意的
            if (woman.getId() == -1 || woman.getInvitationCode() == -1) {
                return "第" + j + "组player加入:" + woman.getInvitationCode() + ":" + woman.getId();
            }
            int key1 = 0;
            Iterator<Entry<Integer, Person>> its = female.entrySet().iterator();
            while(its.hasNext()) {
                Entry<Integer, Person> a =its.next();
                if(a.getValue().getId()==woman.getId()) {
                    key1 = a.getKey();
                }
            }
            female.remove(key1);
            int key = 0;
            Iterator<Entry<Integer, Person>> it = male.entrySet().iterator();
            while(it.hasNext()) {
                Entry<Integer, Person> a =it.next();
                if(a.getValue().getId()==woman.getInvitationCode()) {
                    key = a.getKey();
                }
            }
            male.remove(key);
            n++;
        }
        return "第" + j + "组player加入:";

    }

    /**
     * 描述 初始化嘉宾的,邀请对象id、自身属性总和、被邀请次数
     * 
     * @param female
     * @param male
     */
    public static void initList(Map<Integer, Person> female, Map<Integer, Person> male) {
        Iterator<Map.Entry<Integer, Person>> iteratorM = male.entrySet().iterator();
        while (iteratorM.hasNext()) {
            Person valueM = iteratorM.next().getValue();// 男嘉宾
            valueM.setInviteTheNumber(0);
            valueM.setInvitationCode(10000);
            valueM.setSumScores(0);
        }
        Iterator<Map.Entry<Integer, Person>> iteratorF = female.entrySet().iterator();
        while (iteratorF.hasNext()) {
            Person valueF = iteratorF.next().getValue();// 女嘉宾
            valueF.setInviteTheNumber(0);
            valueF.setInvitationCode(10000);
            valueF.setSumScores(0);
        }

    }

    /**
     * 描述 一个嘉宾从众多嘉宾选自己最满意的
     * 
     * @param gender
     * @param person
     * @param iterator
     * @param scores
     */
    public static void choose(Iterator<Map.Entry<Integer, Person>> iterator, Person person, int scores) {

        while (iterator.hasNext()) {
            Person value = iterator.next().getValue();// 被匹配的嘉宾
            // 满意度
            int tempScores = person.getExpectedAppearance() * value.getAppearance()
                    + person.getExpectedCharacter() * value.getCharacter()
                    + person.getExpectedTreasure() * value.getTreasure();
            // 满意度高的
            if (tempScores > scores) {
                scores = tempScores;
                person.setSumScores(value.getSumScores());// 匹配方获得对方属性总和
                person.setInvitationCode(value.getId());// 匹配方获得对方id
            } else if (tempScores == scores) {
                // 满意度一样高则选择自身属性总和最大的
                if (value.getSumScores() > person.getSumScores()) {
                    person.setSumScores(value.getSumScores());
                    person.setInvitationCode(value.getId());
                } else if (value.getSumScores() == person.getSumScores()) {
                    // 自身属性总和一样则选择id最小的
                    if (value.getId() < person.getInvitationCode()) {
                        person.setInvitationCode(value.getId());
                    }
                }
            }
        }
    }

    /**
     * 描述 统计被邀请最多女嘉宾的次数
     * 
     * @param female
     * @return
     */
    public static int maximum(Map<Integer, Person> female) {
        int max = 0;
        Iterator<Map.Entry<Integer, Person>> iterator = female.entrySet().iterator();
        while (iterator.hasNext()) {
            Person next = iterator.next().getValue();
            if (next.getInviteTheNumber() > max) {
                max = next.getInviteTheNumber();
            }
        }
        return max;
    }

    /**
     * 描述 找到被选次数最多的女嘉宾们
     * 
     * @param invitedWomen
     * @param female
     * @param max
     * @return
     */
    public static List<Person> chosenMost(List<Person> invitedWomen, Map<Integer, Person> female, int max) {
        Iterator<Map.Entry<Integer, Person>> iteratorF = female.entrySet().iterator();
        while (iteratorF.hasNext()) {
            Person next = iteratorF.next().getValue();
            if (next.getInviteTheNumber() == max) {
                invitedWomen.add(next);
            }
        }
        return invitedWomen;

    }

    /**
     * 描述 找出反选的女嘉宾
     * 
     * @param iteratorW
     * @param woman
     */
    public static Person chosenWoman(Iterator<Person> iteratorW, Person woman) {
        int maxScores = 0;
        int minId = 0;
        while (iteratorW.hasNext()) {
            Person next = iteratorW.next();
            if (next.getSumScores() > maxScores) {
                woman = next;
                maxScores = next.getSumScores();
                minId = next.getId();
            } else if (next.getSumScores() == maxScores) {
                if (next.getId() < minId) {
                    woman = next;
                    minId = next.getId();
                }
            }
        }
        return woman;
    }

    /**
     * 描述 找到被反选的男嘉宾们
     * @param iteratorMan
     * @param men
     * @param woman
     */
    public static void invitedMen(Iterator<Map.Entry<Integer, Person>> iteratorMan, Map<Integer, Person> men,
            Person woman) {
        while (iteratorMan.hasNext()) {
            Map.Entry<Integer, Person> nextM = iteratorMan.next();
            Person valueM = nextM.getValue();// 男嘉宾
            if (valueM.getInvitationCode() == woman.getId()) {
                men.put(valueM.getId(), valueM);
            }
        }

    }

}

猜你喜欢

转载自blog.csdn.net/qq_41706670/article/details/81197063
今日推荐