自动分配会议桌demo


这里主要是原理的实现,不管界面问题




-----------------------------------------------------     ----------------------------------------------------------------------------------------------------     -----------------------------------------------

首先创建一个Person类

package com.qsban.demo;


/**
 * 员工参与会议
 * 
 * @author Tao
 *
 */
public class Person {
	
	private int id;
	
	private String companyId;
	
	//private String tableId;
	
	private String  name;


	public String getCompanyId() {
		return companyId;
	}

	public void setCompanyId(String companyId) {
		this.companyId = companyId;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

/*	public String getTableId() {
		return tableId;
	}

	public void setTableId(String tableId) {
		this.tableId = tableId;
	}*/

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}
	
	
}


和一个table类:
package com.qsban.demo;

import java.util.List;


/**
 * 
 * 会议桌
 * 
 * @author Tao
 *
 */

public class Table {
	
	private int id;
	
	private int amount;
	
	private List<Person> list;



	public List<Person> getList() {
		return list;
	}

	public void setList(List<Person> list) {
		this.list = list;
	}

	public int getAmount() {
		return amount;
	}

	public void setAmount(int amount) {
		this.amount = amount;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}
	
	
	
}

接下来就是一个demo的处理方法,直接写在main中测试:
package com.qsban.demo;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

public class APIDemo {
	
	//没有公司的人色暂时分组key
	private static final String NonCompany = "noncompany" ;
	
	//全局桌号  桌号排序,每次生成一个桌子+1
	private static int TableNo = 1;
	/**
	 * 
	 * @param amount 每桌人数
	 * @param pList 数据库中取得参与会议的人List
	 * @return
	 */
	public static List<Table> getResult(int amount, List<Person> pList){
		
		if(amount<=0){
			return null;
		}
		
		//接收返回数据
		List<Table> result = new ArrayList<Table>();
		
		Map<String,List<Person>> exist= new HashMap<String,List<Person>> (); 
		
		//没有公司名的组
		List<Person> list0 = new ArrayList<Person>();
		exist.put(NonCompany, list0);
		
		//按公司名称分成若干组
		for(Person person:pList){
			String cId = person.getCompanyId();
			if("".equals(cId)||cId==null){
				List<Person> list = exist.get(NonCompany);
				list.add(person);
				exist.put(NonCompany, list);
			}else{
				dealHasCompanyPerson(exist,person);
			}
		}
		
		//分配桌子
		Iterator iter = exist.entrySet().iterator();
		
		
		//处理exist中人数等于amount的,优先分配该公司分组恰好是amount的
		while(iter.hasNext()){
			//iter = exist.entrySet().iterator();
			Map.Entry entry = (Map.Entry)iter.next();
			List<Person> values = (List<Person>)entry.getValue();
			if(amount==values.size()){
				Table t= createTable(amount);
				t.setList(values);
				result.add(t);
				//删除
				iter.remove();
			}
		}
		
		//处理  剩下的 公司分组人员
		List<Person> extra = new ArrayList<>();
		
		iter = exist.entrySet().iterator();
		while(iter.hasNext()){
			Map.Entry entry = (Map.Entry)iter.next();
			List<Person> values = (List<Person>)entry.getValue();
			extra = dealGroupByAmount(values, amount, result,extra);	
		}
		
		
		List<Person> lastL = new ArrayList<Person>();
		//处理extra中的人数 即上面每个分组中剩余的人,给他们分配桌子
		lastL = dealGroupByAmount(extra, amount, result,lastL);	
		
		//最后一组
		if(lastL.size()>0){
			Table lastT= createTable(lastL.size());
			lastT.setList(lastL);	
			result.add(lastT);
		}
		
		return result;
	}
	
	/**
	 *  处理分组中的人
	 * @param values
	 * @param amount
	 * @param result
	 * @param extra
	 * @return
	 */
	private static List<Person> dealGroupByAmount(List<Person> values,int amount,List<Table> result,List<Person> extra){
		
		int times = values.size()/amount;
		int c0=0;
		for(int j=0;j<values.size();j+=amount){
			if(values.size()>=amount){
				if(c0<times){
					Table t= createTable(amount);
					if(j<=amount){
						t.setList(values.subList(j, amount));
					}else{
						t.setList(values.subList(j, values.size()));
					}
					result.add(t);
				}else{
					extra.addAll(values.subList(j,values.size()));
				}
				
			}else{
					extra.addAll(values);
			}
			c0++;
		}
		return extra;
	}
	
	/**
	 * 创建桌
	 * @param amount
	 * @return
	 */
	private static Table createTable(int amount){
		Table t= new Table();
		t.setAmount(amount);
		t.setId(TableNo);
		TableNo++;
		return t;
	}
	
	
	/**
	 * 处理有公司的与会人员
	 * @param exist
	 * @param person
	 * @return
	 */
	private static  Map<String,List<Person>> dealHasCompanyPerson(Map<String,List<Person>> exist,Person person){
		String cId = person.getCompanyId();
		List<Person> list = new ArrayList<Person>();
		if(exist.containsKey(cId)){
			 list = exist.get(cId);
		}
		list.add(person);
		exist.put(cId, list);
		return exist;
	}
	
	
	
	public static void main(String[] args) {
		int amount = 1;
		List<Person> pList = new ArrayList<Person>();
		for(int i=0;i<5;i++){
			Person p = new Person();
			StringBuffer temp = new StringBuffer();
			p.setCompanyId(temp.append(String.valueOf(i)).append("abc").toString());
			p.setId(i);
			p.setName("拉拉");
			pList.add(p);
		}
		Person p1 = new Person();
		p1.setCompanyId("1abc");
		p1.setId(34);
		p1.setName("拉拉");
		pList.add(p1);
		Person p2 = new Person();
		p2.setCompanyId("1abc");
		p2.setId(34);
		p2.setName("拉拉");
		pList.add(p2);
		
		
		List<Table> list= getResult(amount, pList);
		for(Table t:list){
			System.out.println("桌号:"+t.getId());
			System.out.println("数量:"+t.getAmount());
			List<Person> p = t.getList();
			for(Person person:p){
				
				System.out.println("人ID:"+person.getId());
				System.out.println("公司名称:"+person.getCompanyId());
			}
			System.out.println("");
		}
	}
	
	
}

仅供自己参考用,增加对集合的理解和运用









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值