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;
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;
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;
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);
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();
Iterator<Map.Entry<Integer, Person>> iterator = female.entrySet().iterator();
while (iterator.hasNext()) {
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());
} else if (tempScores == scores) {
if (value.getSumScores() > person.getSumScores()) {
person.setSumScores(value.getSumScores());
person.setInvitationCode(value.getId());
} else if (value.getSumScores() == person.getSumScores()) {
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);
}
}
}
}