字符串匹配相关算法

今天无意间碰到了需要写子字符串匹配得算法,由于以前一直对字符串得KMP算法不太了解,所以今天趁着这个机会正好记录下这三种算法的差异:

  1. JavaApi实现
  2. 朴素字符串匹配算法
  3. KMP算法

Java的API实现子字符串查找:

在Java的String类里面有一个方法是indexof(str,index), 这个类的话是可以从一个字符串的指定位置查出是否包含子字符串,若不包含则返回的是-1,若包含的话则返回的是该子字符串在字符串中的索引位置。 那么这个算法是什么原理呢,这个算法的原理就是indexof会返回匹配到的字符串的索引,那么当这个算法匹配到了一个之后获取返回的索引,然后再加上字符串的长度,最后再在剩下的字符串里面匹配,便会得出所有的字符串个数。

1
2
3
4
5
6
7
8
9
10
11
public void test(){
String findText= "abcd";
String srcText ="mabcdfafasabcdfa";
int count = 0;
int index = 0;
while ((index = srcText.indexOf(findText, index)) != -1) {
index = index + findText.length();
count++;
}
System.out.println(count);
}
阅读更多

在Mybatis中使用bind进行枚举和模糊查询

首先在网上查询了下关于bind得用法,网上大多数都是bind和模糊查询绑定在一起,但是在这里的话其实bind和枚举一起结合起来使用会有很大的便利,比如一个班级的名称和班级的ID,需要根据班级的ID查询出班级的姓名的话,一般在mybatis中的sql语句是select * from table where class_id =#{class_id} 但是这样就有一个问题,假设学校现在系统升级,每一个班级的ID都变了,这时候需要到处修改mybatis的参数,将其修改成为正确的ID,那么这是一个浩大的工程,同时如果以后再需要改的话,会比较麻烦。处理这个问题,这个时候有如下方法:

  1. 枚举和typehandle组合解决问题;
  2. 枚举和bind一起组合解决;
  3. 暂时没想到

##枚举和bind组合解决:
新建一个实体类:

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
public class clazzEntity {
private String clazz_name;
private int clazz_id;

public clazzEntity(String clazz_name, int clazz_id) {
this.clazz_name = clazz_name;
this.clazz_id = clazz_id;
}

public String getClazz_name() {
return clazz_name;
}

public void setClazz_name(String clazz_name) {
this.clazz_name = clazz_name;
}

public int getClazz_id() {
return clazz_id;
}

public void setClazz_id(int clazz_id) {
this.clazz_id = clazz_id;
}
}

新建一个枚举类:

阅读更多

在Mybatis中使用association进行一对一查询

在今天主要是测试了下在mybatis中使用两种方式来进行一对一查询。在mybatis中进行普通查询的话肯定是一个JavaBean对应一个Sql语句,但是当需要进行两表或者多表之间一对一的查询的时候就需要使用mybatis中的association进行一对一查询,而association的设置一般有两种方式:

##基础类:
员工类:

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
29
public class People implements Serializable {
private int people_id;
private String people_card;
private Role role;

public int getPeople_id() {
return people_id;
}

public void setPeople_id(int people_id) {
this.people_id = people_id;
}

public String getPeople_card() {
return people_card;
}

public void setPeople_card(String people_card) {
this.people_card = people_card;
}

public Role getRole() {
return role;
}

public void setRole(Role role) {
this.role = role;
}
}

权限类:

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
29
public class Role  implements Serializable {
private int myrole_id;
private String role_name;
private RoleDetail roleDetail;

public RoleDetail getRoleDetail() {
return roleDetail;
}

public void setRoleDetail(RoleDetail roleDetail) {
this.roleDetail = roleDetail;
}

public int getMyrole_id() {
return myrole_id;
}

public void setMyrole_id(int myrole_id) {
this.myrole_id = myrole_id;
}

public String getRole_name() {
return role_name;
}

public void setRole_name(String role_name) {
this.role_name = role_name;
}
}
阅读更多

在Spring中使用JWT生成token来验证用户

首先JWT全程是 JSON WEB TOKEN

与Spring进行一个整合:

获取JWT

首先需要在pom中引入几个需要的jar包:

1
2
3
4
5
6
7
8
9
10
11
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>
<dependency>
阅读更多

css记录

在css的样式应用中,script是一个双标签,也就是说script是必须要通过标签闭合的也就是<script></script>,而不可以使用<script XXX/>这样写的话会导致浏览器解析不出来页面,
而单标签的话则是可以通过/>关闭。类似于<meta>标签的话则是不需要/>但是在工作中的话是推荐加上闭合标签,以是的代码有很好的可读性。

同理在css中的p标签如果嵌套了一个h1标签的话会出现解析错误,是因为p标签的话只能出现行内元素和文本,若是出现了块级元素的话:浏览器的解析方法如下:

1
2
3
4
5
6
7
8
9
<p>
<h1>测试的标题</h1>
</p>

浏览器解析:

<p></p>
<h1>测试的标题</h1>
<p></p>

垂直方向上的外边距会叠加,即宽的外边距会决定垂直方向上的距离

为设置了宽度的盒子添加边距啥的会导致盒子变得更宽

阅读更多

mysql的一些总结

前言

今天突然有一个写sql的机会,但是是手写,不像之前那样可以在数据库上做测试。这突然让我感觉有的语法有点生疏了,所以乘着这个机会来做一个全部的梳理。

groupby和where的顺序:

今天是有两表做一个等值连接查询的,在这里应该是先where之后再进行group by,group by 是对where条件过滤之后再进行分组处理,所以where在前。

group by

阅读更多

利用Jquery和Spring异步上传文件

异步上传文件:

用Jquery的异步上传文件的时候需要引入一个js文件jquery.form.min.js,用这个文件里面的$.ajaxSubmit()方法来实现一个异步的文件上传功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$(this).ajaxSubmit({
type:'POST',
url: "/uploadfile",
dataType: 'json',
data: serializeData,
contentType: false,
cache: false,
processData:false,
beforeSubmit: function() {
},
uploadProgress: function (event, position, total, percentComplete){
},
success:function(){

},
error:function(data){
alert('上传图片出错');
}
});

在这里的话$("")函数需要是form的id,而且beforeSubmit可以在上传文件之前可以做一些检查,例如文件后缀或者文件大小之类的检查。

在后端的话接受上传的文件其实跟Servlet差不多,主要是从request中获取请求流,参数的话需要标记为这个 @RequestParam("file") MultipartFile file,最后在SpringMvc中有一个方法可以将上传的文件通过移动或者复制然后转移到我们指定的文件夹中:

阅读更多

页面布局以及JS解析json的总结

关于页面的水平垂直居中:

页面的水平垂直居中布局的话目前就我这里了解的话是又两种方法,一种是盒子布局,一种是流式布局:
盒子布局

关于Jquery解析JSON格式的问题

JSON.parse()方法

在使用这个方法解析Json格式的时候一直会报错,但是传入的值却又明明是JSON格式的,所以一直在排查:

阅读更多

MySql和时间相关的查询(二)

DATE_ADD():

这个函数可以将日期往前加上规定的年,月或者日,从而方便统计,例如需要统计本月的某些数据的话,一般来讲肯定是只需要大于本月月初即可,但是为了考虑程序的健壮性的话肯定是需要再加一个限制条件,比如说小于下个月1号。那么就需要一个一个DATE_ADD()函数:

1
2
3
4
5
6
SELECT
*
FROM
table
WHERE time_columns > CONCAT(LEFT(NOW() - INTERVAL 0 MONTH, 7), '-01')
AND time_columns < DATE_ADD(CURDATE()-DAY(CURDATE())+1,INTERVAL 1 MONTH);

这条sql便是求的本月的数据。同时在这里也对当前时间的函数进行一个对比:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
mysql> SELECT CURDATE();
+------------+
| CURDATE() |
+------------+
| 2018-03-28 |
+------------+
1 row in set (0.00 sec)

mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2018-03-28 15:07:15 |
+---------------------+
1 row in set (0.00 sec)

mysql> select CURTIME();
+-----------+
| CURTIME() |
+-----------+
| 15:07:39 |
+-----------+
1 row in set (0.00 sec)

阅读更多

spring连接redis的一些做法以及mybatis的一些感想

Redis启动

首先开启redis服务,windows的redis下载在github windows的redis下载地址,然后解压出来最后开启那个redis-server。
启动之后显示如下图:

spring配置:

配置

在Spring中也可以通过配置文件redis.properties配置,但是由于在这个项目中的配置文件已经太多了,所以选择使用类的方式进行配置:

阅读更多