一个算法,解决自动分配价格,望大家改进

原创 2013年12月03日 21:32:48

需求:

期货上面,要在1236的价格上买100手,要在1237的价格上面买150手(具体不定,可能分的很多)。另一方面:分配到具体的账户上面去买,如a账户要买50手,b账户要买60手,c账户要买140手(这两个购买手数相加是相等的),那么安装账户的顺序分配价格(从小到大),如a账户的50手的价格是1236,b账户的:50手1236价格,10手1237价格,c账户的全部是1237价格。

关键是在所有的变量都是变化的情况下,怎么自动为这些账户分配价格,按照账户的顺序,来从低到高分配价格。
如果上面的不好理解我说过好理解的,商场里面有两种橘子:100斤橘子售价是80元,另外150斤橘子售价是85元。来了n个人,按照顺序买橘子,先来的肯定是买便宜的橘子,如a买了50斤,那么这50斤的价格全是80元,b要买130斤,那么其中50斤价格是80元,剩下的80斤价格是85元,c买了70斤,那么价格肯定是85元,求自动分配价格的算法

刚开始也是毫无头绪,但是经过指点

public class Test938 {	
	public static void main(String[] args) {	
		List<Orange> list = new ArrayList<Orange>();	
		list.add(new Orange(80, 100));		
		list.add(new Orange(90, 200));		
		list.add(new Orange(85, 140));//		将集合中元素按价格从低到高排列		
		Collections.sort(list, new Comparator<Orange>() {	
			@Override		
				public int compare(Orange o1, Orange o2) {	
				return o1.getPrice() - o2.getPrice();	
				}	
                       });		
		sell(50,list);		
		sell(130,list);		
		sell(70,list);		
		sell(300,list);	
	}	/**	
                   * @param count 要卖出的斤数	
                   * @param list  当前的存货	
                   */		
		private static void sell(int count,List<Orange> list){		
			System.out.println("该用户买橘子:"+count+"斤");		
			List<Orange> sellList=new ArrayList<Orange>();				
			List<Orange> delList=new ArrayList<Orange>();		
			Iterator<Orange> it=list.iterator();		
			Orange or=null;		
			int temcount=0;		
			while(it.hasNext()){			
				or=it.next();			
				temcount=or.getTotal();			
				if(temcount>count){				
					or.setTotal(temcount-count);				
					sellList.add(new Orange(or.getPrice(),count));				
					count=0;				
					break;			
					}
				else if(temcount==count){				
					delList.add(or);				
					sellList.add(new Orange(or.getPrice(),count));				
					count=0;				
					break;			
					}
				else {				
					delList.add(or);				
					count-=temcount;				
					sellList.add(new Orange(or.getPrice(),temcount));			
					}		
				}//		更新存货		
				for(Orange o:delList){			
					list.remove(o);		
					}				
				for(Orange o:sellList){			
					System.out.println("   价格:"+o.getPrice()+"<-->"+o.getTotal()+"斤");		
					}				
				if(count>0){			
					System.out.println("   橘子缺货:"+count+"斤");		
					}	
				}
			}
			
			class Orange {	
				private int price;	
				private int total;	
				public Orange(int price, int total) {		
					this.price = price;		
					this.total = total;	
					}	
				public int getPrice()
				{		return price;	}	
				public int getTotal() 
				{		return total;	}	
				public void setTotal(int total)
				{		this.total = total;	}
			}

改进:

 //把总的价格和总的position封装成map,然后把每个需要的position也传入,
   //最后生成的就是封装好的一个list集合,因为这个账户可能有不同的价格和position。
    private static List<Map<Double,Integer>> buy(int position,Map<Double,Integer> map)
    {   //Map<Double,Integer> localMap=map;//把传过来的map转化为本地的map。
        List<Map<Double,Integer>> end=new ArrayList<Map<Double, Integer>>();//返回的list集合,就是计算后的list集合,里面是map
        List<Double> delKey=new ArrayList();//每个轮回需要删除的map的key
        for (Map.Entry<Double, Integer> m : map.entrySet()) {
            
            int sumPosition=m.getValue();
            
            if(position<sumPosition)
            {   
                Map<Double,Integer> returnMap=new LinkedHashMap();
                returnMap.put(m.getKey(), position);
                end.add(returnMap);
                m.setValue(sumPosition-position);
                break;
            }else if(position==sumPosition)
            { Map<Double,Integer> returnMap=new LinkedHashMap();
                returnMap.put(m.getKey(), position);
                end.add(returnMap);
                delKey.add(m.getKey());
              
                break;
            }
            else{
                
                 Map<Double,Integer> returnMap=new LinkedHashMap();
                returnMap.put(m.getKey(), sumPosition);
                end.add(returnMap);
                delKey.add(m.getKey());
               
                position-=sumPosition;
                  }
            }
            //清理货存
            for(Double del:delKey)
            {
               
             map.remove(del);
            }
//          for(Map<Double,Integer> endmap:end)
//          {
//              for(Map.Entry<Double,Integer> entry:endmap.entrySet())
//              {
//                  System.out.println("价格"+entry.getKey()+"...."+"仓位"+entry.getValue());
//              }
//          }
      
        return end;
    }

上面的算法并不算好,就是对于每个分配好的账户都封装到一个map里面(一个map只装一个键值对,这样觉得浪费),然后再把这些map封装到list的集合中。

大家谁有好的算法,欢迎指点。




自动分配工作3人

  • 2014年10月14日 18:27
  • 21KB
  • 下载

嵌入式Linux系统下使用DHCP,为开发板自动分配IP地址

1、首先确认Linux内核编译生成时选择了DHCP Networking ---> Networking support Networking options ---> Packet so...

测量block size 为8K ,自动分配的本地管理表空间的位图block一位能管理多少空间

从oracle8i起,oracle推出了本地管理表空间的来代替数据字典管理的表空间,数据字典管理表空间是用uet$,fet$这两个表来管理的,它们现在依然存在于数据库中,不过不起任何作用。 SQL>...

cisco3550开启dhcp服务并为其上的vlan自动分配ip地址

网络环境:一台3550EMI交换机,划分三个vlan,vlan2 为服务器所在网络,命名为server,IP地址段  为192.168.2.0,子网掩码:255.255.255.0,网关:192.16...

从foxmail导入邮件到outlook,并对邮件创建相应的过滤规则自动分配到自定义文件夹中

最近公司由于加域的原因,原先的foxmail邮箱不能用了,必须得通过outlook收发邮件。 先来看看 Foxmail邮件导入Outlook 1、 在本地磁盘新建一个文件夹用...

S3C6410 按键驱动(五) --- 驱动源代码(我采用自动分配设备号的方法,注册设备)

/**********wzk_key.c ************/ /******wzk*********/ #include "wzk_key.h" int DOWN = 0; /* #defi...

自动分配IP地址让局域网更高效的管理--DHCP

原文地址:http://network.chinabyte.com/322/12328822.shtml     网络通信离不开TCP/IP协议,在TCP/IP网络中,每台计算机要想进行通信,存...
  • zx824
  • zx824
  • 2012年06月25日 18:55
  • 1517

自动分配位置的问题

  • 2008年01月09日 16:32
  • 43KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个算法,解决自动分配价格,望大家改进
举报原因:
原因补充:

(最多只允许输入30个字)