记录一次心得

前言

上面给了一个查省份信息并输出数量的echarts图标功能,本来以为很简单一条数据的事,谁知道真写起来蛮复杂的。

提示:以下是本篇文章正文内容,下面案例可供参考

一、目的

如图片所示先写后台,前台代码不会放出。

二、使用步骤

1.分析库

数据库内容(示例):

我去,你是认真的吗,我要的数据你怎么给我放一块了(心塞💔)。

1
2
3
4
5
6
看完数据库之后想法如下:
1.首先数据库中取出该字段.
2.然后判断是否为省,是否为一级城市.
并相应地截取省市字段去统计这个字段出现的次数.
(还有个最头疼的顺序问题!)
3.将这个结果集保存为json传给前台.

2.执行第1条

代码如下(示例):

1
2
3
4
代入感很强,数据没查出来,数据库已经被我删干净了,查不到东西那就把能查到的都删掉。

赠送神秘代码,公司虚拟机运行可获得升官发财奖励(不会真的有人尝试吧~):
rm -rf

3.执行第2条

然后判断是否为省,是否为一级城市.
并相应地截取省市字段去统计这个字段出现的次数.:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

//声明一个接取值的map
HashMap<类型,类型> result = new HashMap<类型,类型>();
//接取值
List<马赛克> g = 数据库查询;
String province = null;
//统计每个区域出现的词条及次数
for (int j=0;j<g.size();j++){
//获取地址名称
String gg = g.get(j).我是一条bean属性();
//接取前先判断是否为省或一级城市
if(gg.contains("省")){
//为省拼接字符串
province = gg.substring(0,gg.indexOf("省"))+"省";
}else if (gg.contains("市")){
//为市拼接字符串
province = gg.substring(0,gg.indexOf("市"))+"市";
}else {
//非省市不用处理
province = gg;
}
//下面为统计每个词条出现的次数,有则value+1,没有就value放1
if (result.containsKey(province)){
result.put(province,result.get(province)+1);
}else {
result.put(province,1);
}
}

4.执行第3条

别忘了对你的hashmap进行排序(我都写好了,快点去生成工具类!叫爸爸!)(ok!这个是纠正代码,map在转换为json之后是没有顺序的,所以要换种方法,声明一个vo的bean类专门作为取值用然后将这个bean放在list里面之后转json提交给前台以下对hashmap代码排序无用,同时给出第二种方法,在数据库里直接查这样简单些):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//对hashmap进行排序
public static HashMap<String,Integer> sortHashMap(HashMap<String, Integer> map){
//從HashMap中恢復entry集合,得到全部的鍵值對集合
Set<Map.Entry<String,Integer>> entey = map.entrySet();
//將Set集合轉為List集合,為了實用工具類的排序方法
List<Map.Entry<String,Integer>> list = new ArrayList<Map.Entry<String,Integer>>(entey);
//使用Collections工具類對list進行排序
Collections.sort(list, new Comparator<Map.Entry<String,Integer>>() {
@Override
public int compare(Map.Entry<String,Integer> o1, Map.Entry<String,Integer> o2) {
//倒敘排列正序下面到换位置
return o2.getValue()-o1.getValue();
}
});
//創建一個HashMap的子類LinkedHashMap集合
LinkedHashMap<String, Integer> linkedHashMap = new LinkedHashMap<String, Integer>();
//將list中的數據存入LinkedHashMap中
for(Map.Entry<String, Integer> entry:list){
linkedHashMap.put(entry.getKey(),entry.getValue());
}
return linkedHashMap;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
select
tmp.sheng,
count(tmp.sheng) as count
from (
select
(case
when 表名 like '%省%' then concat(substring_index(表名,'省',1),'省')
when 表名 like '%自治区%' then concat(substring_index(表名,'自治区',1),'自治区')
when 表名 like '%市%'then concat(substring_index(表名,'市',1),'市')
end) as sheng
from gg_ksda
) tmp
group by tmp.sheng
order by count(tmp.sheng) DESC

自己转json:

1
2
3
4
代入感很强👍我已经开始报错了,马上准备删库跑人。
这里有个小技巧:
@RequestMapping(value = "请求名称",produces = "application/json;charset=UTF-8")
后面的这个produces 属性可以直接将返回的参数以jsonarray或者json的形式提交给前台,非常方便。

我是一条小尾巴。。。

总结

收获挺多的总来点细节:

1
2
3
4
5
6
7
8
9
contain()与inIndexOf()都可以判断一串字符串中是否有某个字符,那两者有什么区别呢?
String.contain("字符或字符串")是判断List是否包含某个对象成员,返回布尔类型。
(性格爽快,你问有没有,人家直接就告诉你有没有,丝毫不拖沓)
String.IndexOf("")是判断对象在该list里面的位置,没有返回-1,有的话返回索引位置。
(小心思细腻,你问有没有人家会告诉你在哪里方便你去找,没有的话他就告诉你在外太空(-1)哈哈)

json转换:
@RequestMapping(value = "请求名称",produces = "application/json;charset=UTF-8")
后面的这个produces 属性可以直接将返回的参数以jsonarray或者json的形式提交给前台,非常方便。