CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  J2SE / 基础类

求助把一些数值按指定的和进行分组

楼主jo_kevin()2006-04-01 19:30:53 在 Java / J2SE / 基础类 提问

有n个已经编号的面,现在要把这些面按指定的面积值t进行分组,每一组面的面积总和不能超过指定值  
   
  t,但是当这个面的值大于或等于d时就要单独分为一组。(注,程序是通过编号来读取面积的,可以把  
   
  面积和编号放在多维数组中)  
   
  示例:  
  t=200  
  d=160  
  编号   面积    
  1   30  
  2   110  
  3   80  
  4   90  
  5   20  
  6   73  
  7   180  
  8   80  
  9   40  
  10   50  
  11   170  
  12   80  
   
  按题目要求的结果为:  
   
  编号   面积    
  第一组  
  1   30  
  3   80  
  4   90  
   
   
  第二组  
  2   110  
  5   20  
  6   63  
   
   
  第三组  
  7   180  
   
   
  第l四组  
   
  8   80  
  9   40  
  10   50  
   
  第五组  
  11   170  
   
   
  第六组(由于80没有组合的对象了,就单独分为一组)  
  12   80  
  问题点数:20、回复次数:7Top

1 楼TONYBLARED(奔放的犀牛)回复于 2006-04-01 21:05:13 得分 0

看了下楼主给的需求,我有不明确的地方:  
  1   “程序是通过编号来读面积的”。好像在楼主给的demo里并未体现。  
   
  本人写了个方法,可大致供楼主参考一下。  
  public   void   doFun01()   {  
  int[]   id   =   {   1,   2,   3,   4,   5,   6,   7,   8,   9,   10,   11,   12   };  
  int[]   square   =   {   30,   110,   80,   90,   20,   73,   180,   80,   40,   50,   170,   80   };  
  int   max   =   200;  
  int   single   =   160;  
  groupSquare(id,   square,   max,   single);  
  }  
   
  public   void   groupSquare(int[]   id,   int[]   square,   int   max,   int   single)   {  
  if   (id.length   !=   square.length)  
  return;  
  List   all   =   new   ArrayList();  
  ArrayList   group   =   new   ArrayList();  
  int   sum   =   0;  
  for   (int   i   =   0;   i   <   id.length;   i++)   {  
  int   index   =   id[i]   -   1;  
  int   value   =   square[index];  
  Map   map   =   new   HashMap();  
  map.put(index   +   "",   value   +   "");  
  if   (value   >=   single)   {  
  List   big   =   new   ArrayList();  
  big.add(map);  
  all.add(big);  
  continue;  
  }  
  if   (sum   +   value   >   max)   {  
  ArrayList   enough   =   (ArrayList)   group.clone();  
  all.add(enough);  
  group.clear();  
  group.add(map);  
  sum   =   value;  
  }   else   {  
  group.add(map);  
  sum   =   sum   +   value;  
  }  
  }  
  print(all);  
  }  
   
  public   void   print(List   all)   {  
  for   (int   i   =   0;   i   <   all.size();   i++)   {  
  Conica.pl("\n组别:"+(i+1));  
  Conica.pl("编号\t面积");  
  List   group   =   (List)all.get(i);  
  for(int   j=0;   j<group.size();   j++){  
  HashMap   map   =   (HashMap)group.get(j);  
  Iterator   it   =   map.keySet().iterator();  
  while(it.hasNext()){  
  String   key   =   (String)it.next();  
  String   value   =   (String)map.get(key);  
  Conica.pl(key+"\t"+value);  
  }  
  }  
  }  
  }  
  Top

2 楼TONYBLARED(奔放的犀牛)回复于 2006-04-01 21:05:34 得分 0

输出结果为:  
   
  组别:1  
  编号 面积  
  0 30  
  1 110  
   
  组别:2  
  编号 面积  
  2 80  
  3 90  
  4 20  
   
  组别:3  
  编号 面积  
  6 180  
   
  组别:4  
  编号 面积  
  5 73  
  7 80  
  8 40  
   
  组别:5  
  编号 面积  
  10 170  
  Top

3 楼TONYBLARED(奔放的犀牛)回复于 2006-04-01 21:28:53 得分 0

不好意思,要修改一下:  
  public   void   groupSquare(int[]   id,   int[]   square,   int   max,   int   single)   {  
  if   (id.length   !=   square.length)  
  return;  
  List   all   =   new   ArrayList();  
  ArrayList   group   =   new   ArrayList();  
  int   sum   =   0;  
  for   (int   i   =   0;   i   <   id.length;   i++)   {  
  int   index   =   id[i];  
  int   value   =   square[index];  
  Map   map   =   new   HashMap();  
  map.put(index+1   +   "",   value   +   "");  
  if   (value   >=   single)   {  
  List   big   =   new   ArrayList();  
  big.add(map);  
  all.add(big);  
  continue;  
  }  
  if   (sum   +   value   >   max)   {  
  ArrayList   enough   =   (ArrayList)   group.clone();  
  all.add(enough);  
  group.clear();  
  group.add(map);  
  sum   =   value;  
  }   else   {  
  group.add(map);  
  sum   =   sum   +   value;  
  }  
  }  
  all.add(group);  
  print(all);  
  }Top

4 楼jo_kevin()回复于 2006-04-01 23:15:52 得分 0

不错的,能不能说说实现的方法或思路Top

5 楼xcrow713(绝体绝命)回复于 2006-04-02 00:25:30 得分 0

上面说的不错,其实思路很简单,从数组的第一个开始判断,若当前这个值大于d的160,就让它单独为一组,后面开始另为一组;若当前值小于160,就把它和当前组中已有的值相加判断和,若和大于t   的200,就把当前值另起一组,和小于200就把当前值添加到当前组中。Top

6 楼dztc()回复于 2006-04-02 00:37:45 得分 0

markTop

7 楼TONYBLARED(奔放的犀牛)回复于 2006-05-25 15:01:09 得分 0

搂主还有什么问题吗?  
  Top

相关问题

关键词

得分解答快速导航

  • 帖主:jo_kevin

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo