`
xingqiliudehuanghun
  • 浏览: 7142 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

发个行转列的代码,顺便了解下大家是如何进行行转列

阅读更多
package com.saturday;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 一个行转列的小程序,将如下结构的数据:
 *    c1,c2,pk,fk1,v1
 *    c1,c2,pk,fk2,v2
 *    c1,c2,pk,fk3,v3
 *    .....
 *  转化为:
 *    c1,c2,pk,v1,v2,v3.....
 *    
 * @author 王建波
 *
 */
public class Record2Horrizen {
	public static void main(String[] args){
		List<Map> records=getRecords(
						DataGetter.getData(),
						"id",
						"course",
						"grade"
					);
		String sTemplete=" ID:%1$-10s"
		                +"姓名:%2$-10s"
        				+"语文:%3$-10s"
        				+"数学:%4$-10s"	
        				+"英语:%5$-10s"	
        				+"物理:%6$-10s";
        				
		for(Map record:records){
			System.out.println(String.format(
				sTemplete,
				record.get("id"),
				record.get("name"),
				record.get("语文")!=null?record.get("语文"):"--",
				record.get("数学")!=null?record.get("数学"):"--",
				record.get("英语")!=null?record.get("英语"):"--",
				record.get("物理")!=null	?record.get("物理"):"--"			
			));
		}
	}
	
	
	/**
	 * 获取行专列后的列表
	 * @param list 原始数据列表(需要提前按主键排序)
	 * @param sPKF 主键字段名称
	 * @param sFKF 外键字段名称
	 * @param sFVF 值字段名称
	 * @return
	 */
	public static List<Map> getRecords(List<Map> list,
									   String sPKF,
									   String sFKF,
									   String sVF){
		List<Map> results=new ArrayList<Map>();		
		
		if(list instanceof List&&list.size()>0){
			Map record,preRecord,rowDataCatch=new HashMap();
			Set<String> colSet=getColSet(list,sFKF,sVF);
			Object pk=list.get(0).get(sPKF);
			
			for(int i=0,len=list.size();i<len;i++){
				record=list.get(i);
				
				//当主键发生跳变或最后一条记录时,行转列输出
				if(i==len-1||!record.get(sPKF).equals(pk)){					
					/*
					 * 若最后一行触发的输出,提前写入缓存。因为写缓存
					 * 操作发生在判断之后,若不这样最后一条数据会被漏掉
					*/
					if(i==len-1){
						rowDataCatch.put(
							record.get(sFKF),
							record.get(sVF)
						);						
					}					
					preRecord=list.get(i-1);
					preRecord.remove(sFKF);
					preRecord.remove(sVF);					
					preRecord.putAll(rowDataCatch);
					
					addRecord(results,colSet,preRecord);
					
					//重新设置主键标记和行数据缓存
					rowDataCatch.clear();
					pk=record.get(sPKF);
				}
				
				//将外键值值字段写入行数据缓存
				if(i<len-1){
					rowDataCatch.put(
						record.get(sFKF),
						record.get(sVF)
					);
				}	
			}
		}
		
		return results;
	}
	
	/**
	 * 统计所有输出列
	 * @param list 数据列表
	 * @param sFKF 外键字段名称
	 * @param sVF  值字段名称
	 * @return
	 */
	private static Set<String> getColSet(List<Map> list,
									    String sFKF,
									    String sVF){
		
		Set<String> colSet=new HashSet<String>();
		
		if(list instanceof List&&list.size()>0){
			Map record=list.get(0);
			
			//非变化字段集合
			for(Object key:record.keySet()){
				if(!key.equals(sFKF)&&!key.equals(sVF))
					colSet.add(key.toString());
			}
			
			//变化字段集合
			for(Map item:list){
				colSet.add((String)item.get(sFKF));
			}
		}		
		
		return colSet;
	}
	
	/**
	 * 将行数据进行列补齐操作后写入输出列表
	 * @param list
	 * @param colSet
	 * @param rowData
	 */
	private static void addRecord(List<Map> list,
			                     Set<String> colSet,
			                     Map rowData){		
		//补齐不存在的列
		for(String column:colSet){
			if(!rowData.containsKey(column)){
				rowData.put(column,null);
			}			
		}
		
		list.add(rowData);
	}
}


从数据库读数据比较麻烦,手动添了几条数据
package com.saturday;

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

public class DataGetter {
	public static List<Map> getData(){
		List<Map> datas=new ArrayList<Map>();
		Map record;
		
		//记录1
		record=new HashMap();
		record.put("id", "id-1");
		record.put("name","姓名1");
		record.put("course","语文");
		record.put("grade", 30);
		datas.add(record);
		
		record=new HashMap();
		record.put("id", "id-1");
		record.put("name","姓名1");
		record.put("course","数学");
		record.put("grade", 40);
		datas.add(record);	
		
		record=new HashMap();
		record.put("id", "id-1");
		record.put("name","姓名1");
		record.put("course","英语");
		record.put("grade",60);
		datas.add(record);			

		//记录2
		record=new HashMap();
		record.put("id", "id-2");
		record.put("name","姓名2");
		record.put("course","语文");
		record.put("grade", 60);
		datas.add(record);
		
		record=new HashMap();
		record.put("id", "id-2");
		record.put("name","姓名2");
		record.put("course","物理");
		record.put("grade", 80);
		datas.add(record);	
		
		//记录3
		record=new HashMap();
		record.put("id", "id-3");
		record.put("name","姓名3");
		record.put("course","语文");
		record.put("grade", 60);
		datas.add(record);
		
		record=new HashMap();
		record.put("id", "id-3");
		record.put("name","姓名3");
		record.put("course","英语");
		record.put("grade", 80);
		datas.add(record);
		
		return datas;
	}
}


控制台输出:
ID:id-1      姓名:姓名1       语文:30        数学:40        英语:60        物理:--       
ID:id-2      姓名:姓名2       语文:60        数学:--        英语:--        物理:80       
ID:id-3      姓名:姓名3       语文:60        数学:--        英语:80        物理:--            
分享到:
评论
4 楼 folie2006 2009-07-22  
如果把map换成对象之后,又怎么实现呢.
3 楼 抛出异常的爱 2009-07-22  
map(key,value)

key = x作标_y作标
2 楼 xingqiliudehuanghun 2009-07-21  
以前我们也用数据库实现,但很麻烦尤其是换数据库的时候,还要重写
1 楼 Leapiny 2009-07-21  
我行列转换一般在数据库测用sql实现。

相关推荐

    Java软著代码整理开源工具

    Java版本软著源代码整理工具,最近在申请软著20个,要准备源代码,还要删注释删空格,一个60页我想死了,工欲善其事必先利其,还是写个代码跑快点,网上参考了下,修修改...顺便还放个软件使用说明书的模板大家参考下

    进制转换(进行十进制与任意进制的转换)我的作业顺便发一下以供参考

    cout请输入一个浮点型整数的小数部分"; cin&gt;&gt;arr; len=strlen(arr); for(int i=0;i;i++) { a=arr[i]-'0'; for(int j=-1;j;j++) a=a/10; sum+=a; } cout您输入的浮点型小数是:"; cout请输入你要转换的...

    MATLAB程序分享MATLAB实现正方体旋转源程序代码-MATLAB实现正方体旋转 源程序代码.rar

    MATLAB程序分享MATLAB实现正方体旋转源程序代码-MATLAB实现正方体旋转 源程序代码.rar 程序代码见附件,拿资料请顺便顶个贴~~ 如果下载有问题,请加我 qq 1530497909,给你在线传

    MSN机器人源代码(转)

     做这个没有什么目的,只是看看到底别人是怎样实现的,自己做了2个小时就实现了,没有什么难度,顺便打破别人敝帚自珍的做法,不就是一点点代码吗?还故做神秘的:)因为有现成的DotMSN组件,自己搜索该组件出处。 ...

    视频演示如何玩转一个开源项目 |如何运行+如何读代码 |顺便讲讲IDEA和Spring Boot |Java/Python/C语言/C++项目均适用 |视频教程

    视频演示如何玩转一个开源项目__如何运行+如何读代码__顺便讲讲IDEA和Spring_Boot__Java_Python_C语

    这是在阿里云服务器编写代码顺便练习Git创建的一个小仓库,用于保存服务器上创建的文件,包括了基础的c_GitTest.zip

    这是在阿里云服务器编写代码顺便练习Git创建的一个小仓库,用于保存服务器上创建的文件,包括了基础的c_GitTest

    FC游戏模拟器录制的VMV文件如何转换成MP4格式.mp4

    大家好 今天教大家“FC游戏模拟器录制的VMV文件...这是源文件效果 还是源文件效果好 但是需要用FC模拟器和做这个录像当时用的nes文件打开才行 不是录像用的当时的这个nes文件也没有用 好的 教程结束 感谢大家的观看

    将超星pdg格式转换成pdf的方法

    为了能够在比超星浏览器更好、更方便的浏览器上阅读,并且不对转换出来的文件进行扩散的情况下,才需要将PDG文件转换成图像文件或PDF文件。 二、超星pdg格式转换成pdf的方法 在这里,我们收集整理网上介绍超星pdg...

    head first 设计模式例子源代码 c++版 第三章 装饰者模式

    最近在看head first 设计模式,书上的例子是用java编写的.因为工作上C用的比较多,所以决定编看书,边用C++也编写书上的例子.... 要是大家对这个感兴趣,就继续上传. 代码是在linux下编写的,windows下也可以编译运行.

    java编写的记事本源代码

    本文档包含在 ReadMeNote ...主要方便本人,顺便共享给大家学习。。。 本文件旨在一个做一个示例 点readme按钮可自动生成此文件 不解压有虚拟机就可以直接运行,要看源代码解压后有readme文件里有源代码 这是由我写的

    算符优先分析C++源代码.doc

    在这一个实验中,我将通过算符优先分析文法这一个工具,在语法分析的时候,顺便进行语义分析,也就是识别出语法单位,同时简要的将识别出的中间代码进行计算(目标代码的生成+运行),得到相应的结果,来检验自己...

    log文件转FLASER消息的代码

    鉴于有一些同学在读过我的文章之后,不太知道log文件如何转为FLASER消息,因此我将log文件转FLASER消息的代码上传到CSDN上,以供大家下载,顺便能挣个积分,其实非常简单,就是简单的文件读写操作。

    Python 200行代码实现一个滑动验证码过程详解

    做网络爬虫的同学肯定见过各种各样的验证码,比较高级的有滑动、点选等样式,看起来好像挺复杂的,但实际上它们的核心原理还是还是很清晰的,本文章大致说明下这些验证码的原理以及带大家实现一个滑动验证码。...

    重构_改善既有代码的设计.pdf

    重构是一种系统性的修改现有代码的方法,目的是在不改变其外在行为的情况下,改进代码的内部结构。这一过程对于保持软件的健康和长期可维护性至关重要。 本书首先介绍了重构的基本概念,包括重构的动机、目标和原则...

    朋友想爬一个网站的软文,俺顺便做个视频,分享下

    标题中的“朋友想爬一个网站的软文,俺顺便做个视频,分享下”表明这是一个关于网络爬虫的实践教程,作者可能将通过制作视频来分享如何编写爬虫抓取特定网站上的软文(通常指的是非硬性广告的、具有一定吸引力的文章...

    IE6中PNG透明问题的修复 - 顺便发个 Kill IE 6 的页面

    综上所述,关于“IE6中PNG透明问题的修复”,开发者需要了解浏览器兼容性问题,学习如何使用CSS Hack、JavaScript库或者图片处理工具来解决这个问题。同时,这也提醒我们在设计网页时,要考虑不同浏览器的兼容性,...

    EXT标签、参考和建议下。顺便广告下(图片不出来,看附件)

    顺便广告下(图片不出来,看附件)"的博客文章可能详细讨论了如何使用EXT标签来增强文档的结构和功能。作者可能分享了一些最佳实践,如如何定义EXT标签,何时应该使用它们,以及如何避免潜在的兼容性问题。由于描述中...

    head first 设计模式例子源代码 c++版 第二章 观察者模式

    最近在看head first 设计模式,书上的例子是用java编写的.因为工作上C用的比较多,所以决定编看书,边用C++也编写书上的例子.... 要是大家对这个感兴趣,就继续上传. 代码是在linux下编写的,windows下也可以编译运行.

    商城购物的代码

    【标题】:“商城购物的代码”涉及的知识点主要集中在PHP编程语言上,这是一段用于构建电子商务平台的代码。...它允许开发者创建交互...通过阅读代码、使用调试工具、分析错误信息,我们可以逐步找到问题所在并进行修复。

    字模软件 附VC源代码

    在网上找了好的源代码,都特简单,大家可以做个借鉴 实现功能 1、以横向取模的方式,汉字图形字库 2、以横向取模的方式,ASSIC图形字库 3、可以修改字号、字体 4、根据图像显示调整汉字在显示中央 5、实现了字符串...

Global site tag (gtag.js) - Google Analytics