分类 Java 下的文章

类图

类图(Class diagram)由许多(静态)说明性的模型元素(例如类、包和它们之间的关系,这些元素和它们的内容互相连接)组成。类图可以组织在(并且属于)包中,仅显示特定包中的相关内容。
类图(Class diagram)是最常用的UML图,显示出类、接口以及它们之间的静态结构和关系;它用于描述系统的结构化设计。
类图(Class diagram)最基本的元素是类或者接口。

接口
协作
关系
同其他的图一样,类图也可以包含注解和限制。
类图中也可以包含包和子系统,这两者用来将元素的分组。有时候你也可以将类的实例放到类图中。
注:组件图和分布图和类图类似,虽然他们不包含类而是分别包含组件和节点。
为系统词汇建模型
为系统的词汇建模实际上是从词汇表中发现类,发现它的责任。
模型化简单的协作
协作是指一些类、接口和其他的元素一起工作提供一些合作的行为,这些行为不是简单地将元素相加能得到的。例如:当你为一个分布式的系统中的事务处理过程建模型时,你不可能只通过一个类来明白事务是怎样进行的,事实上这个过程的执行涉及到一系列的类的协同工作。使用类图来可视化这些类和他们的关系。
模型化一个逻辑数据库模式
想象模式是概念上设计数据库的蓝图。在很多领域,你将想保存持久性数据到关系数据库或面向对象的数据库。你可以用类图为这些数据库模式建立模型。

(Class)
一般包含3个组成部分。第一个是类名;第二个是属性(attributes);第三个是该类提供的方法( 类的性质可以放在第四部分;如果类中含有内部类,则会出现第五个组成部分)。类名部分是不能省略的,其他组成部分可以省略。
类名书写规范:正体字说明类是可被实例化的,斜体字说明类为抽象类。
属性和方法书写规范:修饰符 [描述信息] 属性、方法名称 [参数] [:返回类型|类型]
属性和方法之前可附加的可见性修饰符:
加号(+)表示public;减号(-)表示private;井号(#)表示protected;省略这些修饰符表示具有package(包)级别的可见性。
如果属性或方法具有下划线,则说明它是静态的。
描述信息使用 << 开头,使用 >> 结尾。
类的性质是由一个属性、一个赋值方法和一个取值方法组成。书写方式和方法类似。

(Package)
包是一种常规用途的组合机制。UML中的一个包直接对应于Java中的一个包。在Java中,一个包可能含有其他包、类或者同时含有这两者。进行建模时,通常使用逻辑性的包,用于对模型进行组织;使用物理性的包,用于转换成系统中的Java包。每个包的名称对这个包进行了惟一性的标识。
接口
(Interface)
接口是一系列操作的集合,它指定了一个类所提供的服务。它直接对应于Java中的一个接口类型。接口的表示有大概两种方式。具体画法见下例:
关系
常见的关系有:继承(Inheritance),关联关系(Association),聚合关系(Aggregation),复合关系(Composition),依赖关系(Dependency),实现关系(Realization/Implementation)。
其中,聚合关系(Aggregation),复合关系(Composition)属于关联关系(Association)。
一般关系表现为继承或实现关系(is a),关联关系表现为变量(has a ),依赖关系表现为函数中的参
类图中的关系表示
类图中的关系表示
数(use a)。
一般化关系:表示为类与类之间的继承关系,接口与接口之间的继承,类对接口的实现关系。
表示方法: 用一个空心箭头+实线,箭头指向父类。或空心箭头+虚线,如果父类是接口。
关联关系:类与类之间的联接,它使一个类知道另一个类的属性和方法。
表示方法:用 实线+箭头, 箭头指向被使用的类。
聚合关系:是关联关系的一种,是强的关联关系。聚合关系是整体和个体的关系。关联关系的两个类处于同一层次上,而聚合关系两个类处于不同的层次,一个是整体,一个是部分。
表示方法:空心菱形+实线+箭头,箭头指向个体。
合成关系:是关联关系的一种,是比聚合关系强的关系。它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期,合成关系不能共享。
表示方法:实心菱形+实线+箭头,
依赖关系:是类与类之间的连接,表示一个类依赖于另一个类的定义。例如如果A依赖于B,则B体现为局部变量,方法的参数、或静态方法的调用。
表示方法:虚线+箭头 箭头指向被依赖的一方,也就是指向局部变量。

基于规则的中文地址分词与匹配方法

研究背景及意义

随着地理信息系统(GIS)的不断发展和其在各行业的广泛应用,人们对信息共享
的要求也越来越迫切。例如在城市管网、交通导航、工商管理、公共卫生、灾害管理等
领域,地理信息系统作为信息共享的平台,其应用越来越广泛。城市各行业的数据库都
保存着大量和地理位置有关的非空间数据。但是这些行业建设的 GIS 系统并没有足够的
空间位置数据进行支撑,因为地址数据并不能够批量、准确地转化为空间化的信息。这
些数据大多都没有空间位置坐标,无法对应到电子地图上,也就无法进行空间分析和管
理决策。
地址匹配技术正是这一问题的解决方法。地址匹配技术就是把自然语言描述的地理
位置信息转换成地理坐标的过程。通过地址匹配技术,可以把城市各个行业的非空间
信息数据进行空间化,进而运用到 GIS 实际应用中,实现信息的集成与数据共享。
GIS    例如,百度地图
引入一些地址组成的基本概念:
(1)地址串:就是一般的地址,日常的通信地址。例如:青岛市黄岛区前湾港路 579 号。
(2)地址要素:组成地址串的若干词组,如上面的地址就是由 4 个地址要素组成的,分别是“青岛市”、“黄岛区”、“前湾港路”和“579 号”,每个地址要素相对独立。
(3)地址通名:顾名思义,就是地址要素中通用的那些字段。例如:地址要素 “黄岛区”中“区”为地址通名, “前湾港路”中“路”为地址通名。
(4)地址专名:例如:“黄岛区”中“黄岛”为地址专名。地址要素中去掉地址通名后剩余的部分就称为地址专名。
 
Key technologies on Address matching
 
 
Standard address model
 
标准地址模型举例
中文分词方法:
1.基于字典的分词方法
1)正向最大匹配法
2)逆向最大匹配法
3)最少切分词方法
4)逐词遍历法
2.基于理解的分词方法
3.基于统计的分词方法

在人工智能的自然语言处理(NLP)领域也会用到中文分词技术。

正向最大匹配法:
它的基本思想是:首先创建一个用于自动分词的中文词典,可以得知词典中的最长词条的汉字个数,假设个数为 n。然后,取待切分句子的前 n 个字符作为匹配字段,在分词词典中进行字段的查询匹配。如果词典中有这样的字段,则匹配成功。这样,由 n个字符组成的字段被切分出来,作为一个词。如果词典中不存在这样的字段,则匹配失败,将字段末尾去一个汉字,剩下的 n-1 个字符作为新的字段,再进行匹配,如此重复,直到匹配成功为止。
例如句子“我们是中华人民共和国的公民”,假设字典的最长词长为 7,它的正向最
大匹配法的分词流程如下表 所示。
 
分词过程实例
Process of segmentation
标准数据库的创建:
建立地址标准数据库系统是地址匹配的前提工作,需要将采集的城市地址按照确定
的标准地址模型进行标准化。
在创建的标准地址库中,分别存储地址的行政区划部分和详细街道地址部分。
 
中文地址的组成复杂多样,对比标准地址模型,可能存在地址表达不完整、残缺的情况。(设定:1道路名,2门牌号,3住宅小区,4楼牌号,5建筑物。)例如地址址武汉市青山区工业一路21号,是1(道路名)+2(门牌号)的模式,没有3、4、5三种地址要素。因此需要定义规则以便于后面地址匹配的进行。如下表所示。
 
 
 
 
地址匹配规则树
Geocoding rule tree
 
对于存在语义歧义的模糊地址,可以利用栈存储所有歧义情况,并构建一棵歧义地址树,按照深度优先原则遍历该树,直至查询到满足规则的地址记录为止。当查询失败时,可以读取栈中上一层的歧义地址继续查询。虽然一定程度上加大了查询的复杂度,但可以比较好的应对歧义模糊地址的匹配问题。
 
例如,地址“江汉墨水湖东侧12号楼B座301室”,首先,行政区划部分应该是“江汉区”,缺少地址通名“区”;“墨水湖”表述有歧义,可能是墨水湖路,也可能是墨水湖小区;另外,“东侧、B座301室”为多余信息,应该去掉。以此地址为例,算法的具体步骤如下:
1)判断字符串中是否存在行政区划。通过搜索标准地址库中行政区划表,查找到“江汉”一词与记录“江汉区”模糊匹配,将其分割出来。
2)对剩余字符串“墨水湖东侧12号楼B座301室”进行地址分词匹配。通过匹配规则树,限定了搜索字段为1(道路名)、3(住宅小区名)、5(建筑物)。调用最大正向匹配算法,查询到“墨水湖”分别与1墨水湖路和3墨水湖小区两个字段模糊匹配,因此产生语义歧义。并将1与3先后入栈,栈顶为3,故先将“墨水湖”匹配到3,查询规则库,没有满足条件的规则,故对“东侧12号楼B座301室”继续进行分词匹配。通过规则树,3后面只有4。继续调用最大匹配算法,在标准地址库中的4字段中查询剩余子串 “东侧12号楼B座301室”,无匹配结果。

故重新选取栈顶元素,将“墨水湖”匹配到1,查询规则库无满足的规则,故继续分词匹配。查询规则树并确定备选字段为2、3、4、5。搜寻字符串“东侧12号楼B座301室”,查找到“12号楼”,与4字段有一条匹配记录,将该词记入分词结果词组。此时查询规则库,找到规则三满足条件。分词匹配算法完成。
运算结果:对于模糊地址“江汉墨水湖东侧12号楼B座301室”,分词结果为“墨水湖、12号楼”,在标准地址库中找到了地址记录“墨水湖东路15号12号楼”。
 

Java实现正向最大匹配算法的分词算法

package com.demo;
import java.io.*;
import java.util.ArrayList;
/**
 * 正向最大匹配算法的分词算法.
 */
public class MM {
    String Maxlen;
    ArrayList<String> dict;
    String s;
    String subs;
    String result = "";
    public MM() {
        dict = new ArrayList<String>();
        dict.add("山西");
        dict.add("大同");
        dict.add("云冈");
        dict.add("校西街");
        dict.add("小区");
    }
    //最大正向匹配算法
    public String MMwork(int len, String sen) {
        while (sen.length() != 1) {
            while (true) {
                if (len < sen.length()) {
                    s = sen.substring(0, len);
                } else {
                    len = sen.length();
                    s = sen.substring(0, len);
                }
                if (dict.contains(s) || len == 1) {
                    result = result + s + "/";
                    break;
                } else {
                    len = len - 1;
                }
            }
            sen = sen.substring(len);
            len = 3;
        }
        result = result + sen + "/";
        return result;
    }
    public static void main(String[] args) {
        MM mm = new MM();
        System.out.println(mm.MMwork(3,"山西省大同市云冈区校西街201号"));
    }
}

参考链接:https://blog.csdn.net/yin5627/article/details/78231914

try-with-resource语法糖

JDK7及其之后的资源关闭方式

public static void main(String[] args) {
    FileInputStream inputStream = null;
    try {
        inputStream = new FileInputStream(new File("test"));
        System.out.println(inputStream.read());
    } catch (IOException e) {
        throw new RuntimeException(e.getMessage(), e);
    } finally {
        if (inputStream != null) {
            try {
                inputStream.close();
            } catch (IOException e) {
                throw new RuntimeException(e.getMessage(), e);
            }
        }
    }
}
public static void main(String[] args) {
    try (FileInputStream inputStream = new FileInputStream(new File("test"))) {
        System.out.println(inputStream.read());
    } catch (IOException e) {
        throw new RuntimeException(e.getMessage(), e);
    }
}

1、当一个外部资源的句柄对象实现了AutoCloseable接口,JDK7中便可以利用try-with-resource语法更优雅的关闭资源,消除板式代码。
2、try-with-resource时,如果对外部资源的处理和对外部资源的关闭均遭遇了异常,“关闭异常”将被抑制,“处理异常”将被抛出,但“关闭异常”并没有丢失,而是存放在“处理异常”的被抑制的异常列表中。

Java 关键词 transient

java语言的关键字,变量修饰符,如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。换句话来说就是,用transient关键字标记的成员变量不参与序列化过程。
Java的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我们不想用serialization机制来保存它。为了在一个特定对象的一个域上关闭serialization,可以在这个域前加上关键字transient。当一个对象被序列化的时候,transient型变量的值不包括在序列化的表示中,然而非transient型的变量是被包括进去的。
敏感信息不要被序列化!在编码中,建议使用 transient 关键字将其保护起来。
反序列化中,建议在 readObject 中实现与对象构件过程相同的安全检查和数据检查。
另外,在 JDK 9 中,Java 引入了过滤器机制,以保证反序列化过程中数据都要经过基本验证才可以使用。其原理是通过黑名单和白名单,限定安全或者不安全的类型,并且你可以进行定制,然后通过环境变量灵活进行配置, 更加具体的使用你可以参考 ObjectInputFilter

idea 最常用快捷键

最常用快捷键
sout 输出语句
psvm 输出main方法
fori 输出for语句
iter 输出foreach语句
Ctrl+Shift+U 大小写转换
Ctrl+Shift+N 可以快速打开文件
Ctrl+Shift+T 生成测试用例
Ctrl+Shift+Enter 补全一切符号
Alt+Shift+Up and Alt+Shift+Down 上下移动当前行
Ctrl+Alt+B 查看抽象方法的实现
Ctrl+Alt+Space 类名提示
Ctrl+Alt+L 格式化代码
Ctrl+Alt+O 优化导包
Ctrl+E 显示最近编辑的文件列表
Ctrl+F12 显示当前文件的结构
Ctrl+P 显示参数信息
Ctrl+Y 删除整行
Ctrl+O 重写父类的方法
Ctrl+I 重写接口的方法
Ctrl+D 复制当前行
Ctrl+H 查看类的继承体系
Ctrl+N 可以快速打开类
Alt+句点 代码提示
Alt+Enter 智能修复,如导包,生成局部变量
Alt+Insert 生成构造器/Getter/Setter等
Shift double 快速查找类/文件

bootstrap table ajax请求超时时间设置

bootstrap table可以设置超时时间:ajaxOptions
这个设置是依赖于jquery的ajax的设置:
Additional options for submit ajax request. List of values: http://api.jquery.com/jQuery.ajax.
jquery里的默认超时时间没有设置,因此为0,但是前端页面确实有超时请求的处理现象,其实是浏览器在控制着请求的超时,并且每个浏览器都超时时长都不一样。
timeout
Type: Number
Set a timeout (in milliseconds) for the request. A value of 0 means there will be no timeout. This will override any global timeout set with $.ajaxSetup(). The timeout period starts at the point the $.ajax call is made; if several other requests are in progress and the browser has no connections available, it is possible for a request to time out before it can be sent. In jQuery 1.4.x and below, the XMLHttpRequest object will be in an invalid state if the request times out; accessing any object members may throw an exception. In Firefox 3.0+ only, script and JSONP requests cannot be cancelled by a timeout; the script will run even if it arrives after the timeout period.
用户域名访问的时候注意要看nginx的超时时间设置

正则表达式

[0-9]+ 匹配数字的
(i_9 + i_787)/i_78987 – i_78965 匹配字符串和数字组合的

面向对象编程的原则

进行面向对象编程,掌握基本的设计原则是必须的,我今天介绍最通用的部分,也就是所谓的S.O.L.I.D 原则。
单一职责(Single Responsibility),类或者对象最好是只有单一职责,在程序设计中如果发现某个类承担着多种义务,可以考虑进行拆分。
开关原则(Open-Close, Open for extension, close for modification),设计要对扩展开放,对修改关闭。换句话说,程序设计应保证平滑的扩展性,尽量避免因为新增同类功能而修改已有实现,这样可以少产出些回归(regression)问题。
里氏替换(Liskov Substitution),这是面向对象的基本要素之一,进行继承关系抽象时,凡是可以用父类或者基类的地方,都可以用子类替换。
接口分离(Interface Segregation),我们在进行类和接口设计时,如果在一个接口里定义了太多方法,其子类很可能面临两难,就是只有部分方法对它是有意义的,这就破坏了程序的内聚性。
对于这种情况,可以通过拆分成功能单一的多个接口,将行为进行解耦。在未来维护中,如果某个接口设计有变,不会对使用其他接口的子类构成影响。
依赖反转(Dependency Inversion),实体应该依赖于抽象而不是实现。也就是说高层次模块,不应该依赖于低层次模块,而是应该基于抽象。实践这一原则是保证产品代码之间适当耦合度的法宝。
OOP 原则实践中的取舍
值得注意的是,现代语言的发展,很多时候并不是完全遵守前面的原则的。

bootstrap table服务端分页如何在后台获取pageNumber和pageSize

不知道为什么params有时候会没有pageNumber和pageSize这两个参数,需要自己取下,关键就是

$("#table").bootstrapTable("getOptions").pageSize

完整代码如下:

        queryParams: function queryParams(params){
//        	console.log("xxxxddd:"+JSON.stringify($("#table").bootstrapTable("getOptions")));
        	var ps = $("#table").bootstrapTable("getOptions").pageSize;
        	var pn = $("#table").bootstrapTable("getOptions").pageNumber;
        	if(typeof(ps) == "undefined"){
        		ps = params.pageSize;
        	}
        	if(typeof(pn) == "undefined"){
        		pn = params.pageNumber;
        	}
        	var param = {
        			pageSize: ps,
        			pageNumber: pn,
        			data: JSON.stringify(dataTmp)
        	};
        	return param;
        }