被老板逼着实现了Excle的透视表分析算法
package com.example.demo;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.ContextHierarchy;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import com.alibaba.fastjson.JSON;
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextHierarchy({ @ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/applicationContext.xml" }),
@ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/spring-mvc-servlet.xml" }) })
public class QueryTest {
public static void main(String[] args) throws SQLException {
List l = new ArrayList();
l.add(new FieldDefinitionDomain("zz","int","money","line"));
l.add(new FieldDefinitionDomain("xx","String","date","row"));
l.add(new FieldDefinitionDomain("zz","String","company","row") );
String fieldJsonList = JSON.toJSONString(l);
Map fieldMap = new HashMap();
List<FieldDefinitionDomain> parseArray = JSON.parseArray(fieldJsonList, FieldDefinitionDomain.class);
ArrayList<String[]> strlist = new ArrayList<>();
List<String[]> intList = new ArrayList<>();
String headfieldName = null;
String headType = null;
String headTableName = null;
String headDirection = null;
for (FieldDefinitionDomain fd : parseArray) {
String [] strarray = new String[4];
strarray[0] = fd.getTableName();
strarray[1] = fd.getFieldName();
strarray[2] = fd.getType();
strarray[3] = fd.getDirection();
if(fd.getType().equals("int")||fd.getType().equals("long")) {
intList.add(strarray);
}else {
strlist.add(strarray);
}
}
headTableName = strlist.get(0)[0];
headfieldName = strlist.get(0)[1];
headType = strlist.get(0)[2];
headDirection = strlist.get(0)[3];
for (String[] array : strlist) {
if(!array[1].equals(headfieldName)) {
List arrayList = new ArrayList();
addList(arrayList,array);
fieldMap.put(array[0], arrayList);
}
}
List<Integer> iilist = new ArrayList();
for (String[] array : intList) {
List list = (List)fieldMap.get(array[0]);
if(!notEmpty(list)) {
List arrayList = new ArrayList();
addList(arrayList,array);
fieldMap.put(array[0], arrayList);
}
((List)list.get(0)).add(array[1]);//字段名
((List)list.get(1)).add(array[2]);//字段类型
((List)list.get(2)).add(array[3]);//排列(行还是竖)
iilist.add(((List)list.get(2)).size());
}
List resultList = new ArrayList();
TableSQLUtils tableSQLUtils = new TableSQLUtils();
List list = tableSQLUtils.query(headTableName, headType, headfieldName, null);
Map mm = new HashMap();
list.forEach(ll1 ->mm.put(((List)ll1).get(0), new ArrayList()));
for (Object o2 : fieldMap.keySet()) {
List llist= (List)fieldMap.get(o2);
List fieldList = (List) llist.get(0);
List typeList = (List) llist.get(1);
String fieldStr = headfieldName+",";
String typeStr = headType+",";
for (Object object : fieldList) {
fieldStr+=object+",";
}
for (Object object : typeList) {
typeStr+=object+",";
}
fieldStr=fieldStr.substring(0,fieldStr.length()-1);
typeStr=typeStr.substring(0,typeStr.length()-1);
List query = tableSQLUtils.query((String)o2, typeStr, fieldStr,null);
query.forEach(ll->{
List ll1 = (List)ll;
List ll2 = ((List) mm.get(ll1.get(0)));
if(ll2!=null)
ll2.add(ll1);
});
mm.put("numberindex", iilist);
System.out.println(mm);
}
}
private static void addList(List arrayList, String[] array) {
List arrayList2 = new ArrayList();
List arrayList3 = new ArrayList();
List arrayList4 = new ArrayList();
arrayList2.add(array[1]);
arrayList3.add(array[2]);
arrayList4.add(array[3]);
arrayList.add(arrayList2);
arrayList.add(arrayList3);
arrayList.add(arrayList4);
}
private static void sum(List <Long> list) {
Long sum = 0L;
if(notEmpty(list)) {
for (int i = 0; i < list.size(); i++) {
sum+=list.get(i);
}
list.add(sum);
}
}
public static Boolean notEmpty(List list) {
if(list!=null&&list.size()>0)return true;
return false;
}
}
package com.example.demo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class TableSQLUtils {
private String driver="com.mysql.jdbc.Driver";
private String username="finance_uatuser";
private String password="e2guTHK2U6y_G2o0LTQJGneTuWOOqp/wy";
private String url="jdbc:mysql://121.43.155.144:3306/finance_uat?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull";
public List query(String table,String type,String fieldName,String prefs) throws SQLException {
Connection connection = null;
PreparedStatement prepareStatement =null;
ResultSet rs = null;
// Map m = new HashMap();
Map map = new HashMap();
String[] fieldsplit = fieldName.split(",");
List resultList = new ArrayList();
String[] types = type.split(",");
// if(fieldsplit.length>1) {
// for (int i = 1; i < fieldsplit.length; i++) {
// map.put(fieldsplit[i],new ArrayList());
// }
// }if(fieldsplit.length==1) {
// for (int i = 0; i < fieldsplit.length; i++) {
// map.put(fieldsplit[i],new ArrayList());
// }
// }
try {
//1.获取Connection
connection = getConnection();
//3.准备Sql
String sql = "select ";
for (String sf : fieldsplit) {
sql+=sf+",";
}
sql=sql.substring(0, sql.length()-1);
sql+=" from "+table;
//if(fieldsplit.length>1)
// sql+=" where "+fieldsplit[0]+" = ?";
prepareStatement = connection.prepareStatement(sql);
//if(fieldsplit.length>1)
//prepareStatement.setString(1,prefs);
//4.执行查询,得到ResultSet
rs = prepareStatement.executeQuery();
//5.处理ResultSet
while(rs.next()){
//rs.get+数据库中对应的类型+(数据库中对应的列别名)
switchType(types,fieldsplit,rs,resultList);
}
return resultList;
} catch (Exception e) {
e.printStackTrace();
return null;
}finally{
rs.close();
prepareStatement.close();
connection.close();
}
}
private void switchType(String[] types, String[] field, ResultSet rs, List resultList) throws SQLException {
List arr = new ArrayList();
for (int i = 0; i < field.length; i++) {
listAdd(rs,types[i],field[i], arr);
}
resultList.add(arr);
}
private void listAdd(ResultSet rs,String type, String field, List arr) throws SQLException {
Object o = null;
if(type.equals("int")) {
o = (long) rs.getInt(field);
}
if(type.equals("String")) {
o = rs.getString(field);
}
if(type.equals("Long")) {
o = rs.getLong(field);
}
arr.add(o);
}
private Connection getConnection() throws ClassNotFoundException, SQLException {
Class.forName(driver);
Connection connection = DriverManager.getConnection(url, username, password);
return connection;
}
public static void main(String[] args) throws SQLException {
TableSQLUtils tableSQLUtils = new TableSQLUtils();
List query = tableSQLUtils.query("zz", "String,int", "date,money",null);
query.forEach(str->System.out.println(str));
}
}
被老板逼着实现了Excle的透视表分析算法的更多相关文章
- 【Excle数据透视表】如何新建数据透视表样式
如果觉得Excle给出的数据透视表样式不符合自己的心意,可以自己定义一个数据透视表样式 步骤1 单击数据透视表区域任意单元格→数据透视表工具→设计→样式组中的下拉按钮,打开数据透视表样式库→新建数据透 ...
- 【Excle数据透视表】如何按照地区交替填充背景颜色
现存在如下数据透视表 需要根据地区填充不同的背景颜色 步骤 选定数值区域→开始→条件格式→新建规则,出现如下窗口: 公式:=MOD(COUNT(1/(MATCH($A$4:$A4,$A$4:$A4,) ...
- 【Excle数据透视表】如何让字段标题不显示“求和项”
我们做好了数据透视表之后是下面这个样子的 这个样子一点都不好看,那么如何去掉"求和项"呢? 步骤 方法① 单击B3单元格→编辑区域输入"数量 "→Enter(也 ...
- 【Excle数据透视表】如何为数据透视表应用样式
如下数据透视表样例,如何为该数据透视表设置样式呢? 步骤 单击数据透视表区域的任意单元格→数据透视表工具→设计→数据透视表样式→打开下拉箭头即可任意选择
- 【Excle数据透视表】如何水平并排显示报表筛选区域的字段
原始效果 目标效果 解决方案 设置数据透视表"在报表区域筛选显示字段"为"水平并排" 步骤 方法① 单击数据透视表任意单元格→数据透视表工具→分析→选项→布局和 ...
- 【Excle数据透视表】如何在数据透视表中使用合并单元格标志
先有数据透视表如下: 现在看着这个格式不舒服,我们希望调整成如下这种样式 步骤 单击数据透视表任意单元格→右键→数据透视表选项→布局和格式→合并且居中排列带标签的单元格 注意:如果数据透视表报表布局不 ...
- 【Excle数据透视表】如何在组的顶部显示分类汇总
调整前 调整后 例 ...
- 【Excle数据透视表】如何重复显示行字段的项目标签
前提:该数据透视表以表格形式显示 解决办法: 通过报表布局设置"重复所有项目标签" 修改前样式 步骤 单击数据透视表中任意单元格→设计→报表布局→重复所有项目标签 修改后样式
- 【Excle数据透视表】如何调整压缩形式显示下的缩进字符数
调整前: ...
随机推荐
- lock to deteck in oracle
0,5,10 0-23 * * * /home/oracle/utility/blocker/detect_blocker.sh db 120 > /home/oracle/utility/tr ...
- Hadoop YARN学习之组件功能简述(3)
Hadoop YARN学习之组件功能简述(3) 1. YARN的三大组件功能简述: ResourceManager(RM)是集群的资源的仲裁者, 它有两部分:一个可插拔的调度器和一个Applicati ...
- STM32 (基础语法)笔记
指针遍历: char *myitoa(int value, char *string, int radix){ int i, d; int flag = 0; char *ptr = string; ...
- 重构29-Remove Middle Man(去掉中间人)
有时你的代码里可能会存在一些"Phantom"或"Ghost"类,Fowler称之为"中间人(Middle Man)".这些中间人类仅仅简单 ...
- PHP自定义函数及内部函数考察点
变量的作用域和静态变量 变量的作用域 变量的作用域也称变量的范围,变量的范围即它定义的上下文背景(也是它的生效范围).大部分的PHP变量只有一个单独的范围.这个单独的范围跨度同样包含了include和 ...
- ssd遇到的bug
从训练一开始就loss为0: 最开始以为是在生成train.lmdb前没有对label_map进行修改,发现并不是这个问题 1.训练的命令是:python ./examples/ssd/ssd_pas ...
- Handler和内部类的正确用法
PS:本文摘抄自<Android高级进阶>,仅供学习使用 Android代码中涉及线程间通信的地方经常会使用Handler,典型的代码结构如下. public class HandlerA ...
- jQuery任意标签锚点跳转插件
// 任意锚点平滑跳转插件// 2010-07-15 v1.0(function($){ $.fn.zxxAnchor = function(options){ var defaults = { ie ...
- getDate() 获取时间 如2018年09月21日 11:32:11
function p(s) { return s < 10 ? '0' + s: s;} function getDate() { var myDate = new Date(); //获取当前 ...
- 笔试算法题(26):顺时针打印矩阵 & 求数组中数对差的最大值
出题: 输入一个数字矩阵,要求从外向里顺时针打印每一个数字: 分析: 从外向里打印矩阵有多重方法实现,但最重要的是构建合适的状态机,这样才能控制多重不同的操作: 注意有四种打印模式(左右,上下,右左, ...