11
回答
这样的结构算不算链表?经理说不是。
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   
public class StatsVo {
	private String name;				//品牌名称
	private int count;					//数量
	private String total;				//总金额
	private StatsVo next;				//下一下统计VO
	
        //....略get,set方法。

}
//.........................................................
public class OrderInfoSrv{
       //略变量定义
       /**
	 * 统计各个品牌每日销售额
	 * @param startTime
	 * @param endTime
	 * @return
	 */
	public List<StatsVo> getStats(String start) {
		//TODO

		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
		int actualMaximum = -1;
		try {
			actualMaximum = MyDateUtil.getActualMaximum(sdf.parse(start+"01000000"));
		} catch (ParseException e) {
			throw new YongExcetion("格式化日期失败");
		}
		String endTime = start+actualMaximum+"235959";
		
		List<Trademark> trademarks = trademarkDao.findAll();
		List<StatsVo> statsVos = new ArrayList<StatsVo>();
		
		for(Trademark t:trademarks){
			StatsVo sv = new StatsVo();
			sv.setName(t.getName());
			statsVos.add(sv);
		}
		StatsVo otherStatsVo = new StatsVo();
		otherStatsVo.setName(GlobalVo.otherTrademark);
		statsVos.add(otherStatsVo);
		
		StatsVo sv = null;
		
		for(int i=0;i<actualMaximum;i++){
			String startTimeTmp = MyDateUtil.add(sdf, endTime, -1, Calendar.DAY_OF_MONTH);
			String startTime = MyDateUtil.add(sdf, startTimeTmp, 1, Calendar.SECOND);
			//查询语句....
			List<OrderInfo> orderInfoList = orderInfoDao.getByStartimeAndEndtime(startTime, endTime);
			// 取出所有的商品明细保存到orderItemInfoList
			List<OrderItemInfo> orderItemInfoList = new ArrayList<OrderItemInfo>();
			if (orderInfoList.size() > 0) {
				for (OrderInfo oi : orderInfoList) {
					OrderItemInfo[] orderItemInfoArr = oi.getOrderItemList();
					if(orderItemInfoArr.length!=0)
						Collections.addAll(orderItemInfoList, orderItemInfoArr);
				}
			}
			// 保存不在品牌里的商品
			List<OrderItemInfo> otherOrderItemInfoList = (List<OrderItemInfo>) ((ArrayList)orderItemInfoList).clone();
			
			int otherIndex = 0;
			// 按品牌统计
			if (orderItemInfoList.size() > 0) {
				//在品牌表中的品牌.....start
				for (int k=0;k<statsVos.size();k++) {
					sv = statsVos.get(k);
					if(sv.getName().equals(GlobalVo.otherTrademark)){ 
						otherIndex = k;
						continue;
					}
					
					long totalTmp = 0;
					int count = 0;
					StatsVo statsTemp = new StatsVo();
					statsTemp.setName(sv.getName());
					
					for (OrderItemInfo oii : orderItemInfoList) {
						// 商品包含品牌名称
						if (oii.getMerchandiseName().contains(statsTemp.getName())) {
							count = count +oii.getBuyNum();
							totalTmp = totalTmp	+ oii.getPrice().multiply(new BigDecimal(oii.getBuyNum())).longValue();
							// 移出已统计的品牌
							otherOrderItemInfoList.remove(oii);
						}
					}
					if(isNull(sv.getTotal())){
						sv.setTotal(String.valueOf(totalTmp));
						sv.setCount(count);
					}else{
						statsTemp.setTotal(String.valueOf(totalTmp));
						statsTemp.setCount(count);
						statsTemp.setNext(sv);
						statsVos.set(k, statsTemp);
					}
				}
				//在品牌表中的品牌.....end
				
				//不在品牌表中的品牌,按名为'其它' 处理.....start
				StatsVo otherTemp = new StatsVo();
				sv = statsVos.get(otherIndex);
				otherTemp.setName(sv.getName());
				long totalTmp = 0;
				int count = 0;
				if (otherOrderItemInfoList.size() > 0) {
					for (OrderItemInfo oii : otherOrderItemInfoList) {
						count = count+oii.getBuyNum();
						totalTmp = totalTmp + oii.getPrice().multiply(new BigDecimal(oii.getBuyNum())).longValue();
					}
				}
				if(isNull(sv.getTotal())){
					sv.setTotal(String.valueOf(totalTmp));
					sv.setCount(count);
				}else{
					otherTemp.setTotal(String.valueOf(totalTmp));
					otherTemp.setCount(count);
					otherTemp.setNext(sv);
					statsVos.set(otherIndex, otherTemp);
				}
				//不在品牌表中的品牌,按名为'其它' 处理.....end
			}else{
				//此日期没有数据,以0填充。
				for(int n=0;n<statsVos.size();n++){
					sv = statsVos.get(n);
					StatsVo temp = new StatsVo();
					temp.setName(sv.getName());
					
					if(isNull(sv.getTotal())){
						sv.setTotal("0");
						sv.setCount(0);
					}else{
						temp.setTotal("0");
						temp.setCount(0);
						temp.setNext(sv);
						statsVos.set(n, temp);
					}
				}
			}
			//System.out.println(startTime+","+endTime);
			endTime = startTimeTmp;
		}
		return statsVos;
	}

}
action中的迭代代码:
public String query(){
		startTime = "201101";
		statsList = orderInfoSrv.getStats(startTime);
		/*for(StatsVo sv:statsList){
			int i = 1;
			while(sv!=null){
				System.out.print(sv.getName()+",数量:"+sv.getCount()+",金额:"+sv.getTotal()+",日期->"+i+++"号");
				sv=sv.getNext();
			}
		}*/
		return "queryOk";
	}

如题,经理说我最后取得的statsVos不是链表结构,是对象.对象 。。
很纠结,请教各位,这到底是不是链表结构?
<无标签>
举报
准码农
发帖于6年前 11回/633阅

以下是问题补充:

  • @准码农 :看完回复收益很大,谢谢大家。 补充一下: 这功能主要用来对每个品牌的商品,某月销售额统计;每个StatsVo对象存储了一个品牌的统计结果,statsList 保存了所有的statsVo. (6年前)
  • @准码农 :举个例子: 8月分商城销售统计: 摩托罗拉手机:1号,40部;2号,70部;...31号,50部。--一个statsVo 健将内裤:1号,130件;2号,200件;3号,210件。--一个statsVo 把这两个统计结果放到一个list里. ps,纠结的是最后不知道该怎么样在jsp页面用标签迭代出来。 (6年前)
共有11个答案 最后回答: 6年前

首先楼主如果写全了的话,statsVos应该是单链表的节点类。

 链表是一种数据结构,对象是oo编程的概念,这两样东西不矛盾。链表的一个节点可以看成是一个对象,写成一个类,初始化成一个实例。

结构和对象?!?!?!?!

这两个有比较的意义么?面向对象,不就是所有万物皆是对象么?链表对于面向对象来说本身就是一个对象吧,不知道这样理解对不对!

另外楼上说的貌似也是,list和链表貌似不同吧!

概念性东西不熟悉,坐等高人!

PS,能解决问题就好了……

呃,话说用数组也能实现链表的,只不过比直接用链表结构更复杂,不合算。以前教材上有过这个例子。你这个直接创建个类做LinkedList的代理不就行了吗?做这么麻烦干嘛?

首先你和经理描述的角度不同,所以没有可比性。你说的链表是从数据结构的角度描述,经理是从编程角度描述成对象。

对象这个描述没有错,因为java语言,除了基本类型(int,long,char..)之外都是对象。List是对象的集合,本身也是对象。

结构上描述成链表,如果你用LinkedList,问题就不大,但你使用的ArrayList返回,描出成链表就有点牵强。

LinkedList是用链表结构实现的,ArrayList是用数组结构实现的。

链表结构最大的特征是一个单元上有个指针指向下一个单元的位置。

就好比数据用下标标注下一个单元的位置,但是数组不能等同于链表,因为数组在物理存储上是连续的,而链表却不一定。

1.你应该大概描述一下要做什么

2.链表一般是这么做:一个结点数据结构:一个是数据;一个是next指针(java里是引用),指向一个同样的结点.next是为了将所有的结点组织起来.但是一般的高级语言都有list这样的结构,一般是模板类,可以放任何的类型,它都可以完成数据的组织,所以不用自己维护结点的关系.简单的来说,StatsVo不用next.只要对你有用的信息就可以了.然后你可以不断的add新StatsVo对象在list里,做为list里的元素.如果要自己写链表结构的话,就不应该用list这样的类,而add这样的方法也要自己写.

顶部