省市二级联动数据库生成代码(JAVA)
最近在给一客户做网站,用的是php,现在需要有一个下拉框选择省市,并且需要保存省市的简拼,如“河北 HB”。我在网上找了半天,发现基本没有符合要求的代码,于是自己顶着浪费巨大时间的风险,动手写了一个自动生成省市二级联动insert语句的代码。由于时间仓促,自己的水平也有限,所以写的代码基本谈不上是合理的,可维护,可扩展的。我在此仅提供一个具体的思路,想把它写的漂亮点,还请广大朋友们跟据自己的需要进行重构。^o^ 还有,最后结果直接输出到了控制台,请大家直接复制到一个文本文件中,并把扩展名改为.sql。在源代码里,我用到了LinkedHashMap这个集合类,目的是为了保持集合元素的顺序。
所用工具:Eclipse,汉字转拼音工具包:pinyin4j 2.5 可点击下载,也可在我的源代码包里找到
所用语言:java
相关文件:CSDN博客不能上传附件,所以我传到百度网盘了,请大家费些心下载,不能下载的请留言告知。
数据来源于谷歌地图
省市列表(无省、市、区字样)
省市列表(带省、市、区)
源代码
注意:由于我不想把省、市、区这样的字也转换成拼音,如河北省转换为HBS,北京市转换为BJS,我把省、市、区相关字样已删除,但我也保留了原文件,有需要的可以下载。
表结构:
[sql]
CREATE TABLE IF NOT EXISTS `city` (
`id` varchar(50) NOT NULL,
`type` varchar(50) NOT NULL,
`parent_id` varchar(50) NOT NULL,
`name` varchar(50) NOT NULL,
`short` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
具体实现请看以下代码:
[java]
package com.zxq.pinyin;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
public class Covert {
/**
* 汉字转拼音,并将结果保存到省或市的map中
* @param words 需要转换的字符串
* @param provinceOrCity 省或市的Map
*/
public static void wordToPinYinSZM(String words, Map<String, String> provinceOrCity) {
//调用Pinyin4J的方法
//定义拼音输出格式
HanyuPinyinOutputFormat hof = new HanyuPinyinOutputFormat();
//大写
hof.setCaseType(HanyuPinyinCaseType.UPPERCASE);
//不包含声调
hof.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
//u用V表示
hof.setVCharType(HanyuPinyinVCharType.WITH_V);
//由于只能对单字转换,所以需要把字符串转换为字符数组
char[] characters = words.toCharArray();
try {
//StringBuilder存放结果
StringBuilder sb = new StringBuilder();
for(int i = 0; i < characters.length; i++) {
//调用汉字转拼音核心方法,大家可以看到返回的是一个数组,因为有的汉字有多音字,所以可能返回多个
//拼音结果,对此,我只取第一个,pinyinArray[0],这样做不好的地方就是可能有的简拼不准确,例如
//“重庆”我得到的是ZQ,zhong qing,这一点有待完善
String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(characters[i], hof);
//substring(0, 1)则表示只取首字母
sb.append(pinyinArray[0].substring(0, 1));
}
//放入省或市的Map中
provinceOrCity.put(words, sb.toString());
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
}
/**
* @param args
*/
public static void main(String[] args) {
//读取事先定义好的省市文本文件,第一行为省/直辖市,第二行为各地级市
File provinceFile = new File("F:\\province_city\\province.txt");
//定义保存省、市数据的数据结构。从里向外看,Map<String, String>保存的是 “省=>简拼” 这样的数据
//如“河北=>HB”。List里面的Map<String, String>则保存着“市=>简拼”的数据,如“保定=>BD”,而list集合
//保存该省下所有市的集合。最外层的Map就是“省=>各市集合”的关联集合,这样省市关系就确定了。
Map<Map<String, String>, List<Map<String, String>>> provinceCity = new LinkedHashMap<Map<String, String>, List<Map<String, String>>>();
try {
//定义输入流,可以使用readline()读取一行
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(provinceFile), "UTF-8"));
String provinceName = ""; <
补充:软件开发 , Java ,