package case_package1; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.Random; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test { public static void main(String[] args) throws IOException { /* 获取姓氏:https://hanyu.baidu.com/s?wd=%E7%99%BE%E5%AE%B6%E5%A7%93&device=pc&from=home 获取男生名字:http://www.haoming8.cn/baobao/12560.html 获取女生名字:http://www.haoming8.cn/baobao/4155.html */ //1、定义变量记录网址 String familyNameNet = "https://hanyu.baidu.com/s?wd=%E7%99%BE%E5%AE%B6%E5%A7%93&device=pc&from=home"; String boyNameNet = "http://www.haoming8.cn/baobao/12560.html"; String girlNameNet = "http://www.haoming8.cn/baobao/4155.html"; //2、爬取数据,把网址上所有的数据拼接成一个字符串 String familyNameStr = webCrawler(familyNameNet); String boyNameStr = webCrawler(boyNameNet); String girlNameStr = webCrawler(girlNameNet); //3、利用正则表达式,把其中符合要求的数据获取出来 ArrayList familyNameTempList = getData(familyNameStr, "(.{4})(,|。)", 1); ArrayList boyNameTempList = getData(boyNameStr, "([\\u4e00-\\u9fa5]{2})(、|。)", 1); ArrayList girlNameTempList = getData(girlNameStr, "(.. ){4}..", 0); //4、处理数据 //familyNameTempList(姓氏) //处理方案:把每一个姓氏拆开并添加到一个新的集合当中 ArrayList familyNameList = new ArrayList<>(); for (String str : familyNameTempList) { for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); familyNameList.add(c + ""); } } //System.out.println(familyNameList); //boyNameTempList(男生的名字) //处理方案:去除其中的重复元素 ArrayList boyNameList = new ArrayList<>(); for (String str : boyNameTempList) { if (!boyNameList.contains(str)) { boyNameList.add(str); } } //System.out.println(boyNameList); //girlNameTempList(女生的姓名) //处理方案:把里面的每一个元素用空格进行切割,得到每一个女生的名字 ArrayList girlNameList = new ArrayList<>(); for (String str : girlNameTempList) { String[] arr = str.split(" "); for (int i = 0; i < arr.length; i++) { girlNameList.add(arr[i]); } } //System.out.println(girlNameList); //5、生成数据 //姓名(唯一)-性别-年龄 ArrayList infos = getInfos(familyNameList, boyNameList, girlNameList, 20, 25); Collections.shuffle(infos); //System.out.println(infos); //6、写出数据 BufferedWriter bw = new BufferedWriter(new FileWriter("/Users/zhaoxiaoyong/Documents" + "/Java/IO_stream_project/Case_module/src/NameInfos.txt")); for (String info : infos) { bw.write(info); bw.newLine(); } bw.close(); } /* * 作用: * 获取男生和女生的信息:张三-男-23 * 形参: * 参数一:装着姓氏的集合 * 参数二:装着男生名字的集合 * 参数三:装着女生名字的集合 * 参数四:男生个数 * 参数五:女生个数 */ public static ArrayList getInfos(ArrayList familyNameList, ArrayList boyNameList, ArrayList girlNameList, int boyCount, int girlCount) { //1、生成男生不重复的名字 HashSet boyhs = new HashSet<>(); while (true) { if (boyhs.size() == boyCount) { break; } //随机 Collections.shuffle(familyNameList); Collections.shuffle(boyNameList); boyhs.add(familyNameList.get(0) + boyNameList.get(0)); } //System.out.println(boyhs); //2、生成女生不重复的名字 HashSet girlhs = new HashSet<>(); while (true) { if (girlhs.size() == girlCount) { break; } //随机 Collections.shuffle(familyNameList); Collections.shuffle(girlNameList); girlhs.add(familyNameList.get(0) + girlNameList.get(0)); } //System.out.println(girlhs); //3、生成男生信息并添加到集合当中 ArrayList list = new ArrayList<>(); Random r = new Random(); for (String boyName : boyhs) { int age = r.nextInt(10) + 18; list.add(boyName + "-男-" + age + "-1"); } //4、生成女生信息并添加到集合当中 for (String girlName : girlhs) { int age = r.nextInt(8) + 18; list.add(girlName + "-女-" + age + "-1"); } return list; } /* * 作用:根据正则表达式获取字符串中的数据 * * 参数一: * 完整的字符串 * * 参数二: * 正则表达式 * * 返回值: * 真正想要的数据 * * */ private static ArrayList getData(String str, String regex, int index) { //1、创建集合存放数据 ArrayList list = new ArrayList<>(); //2、按照正则表达式的规则,去获取数据 Pattern pattern = Pattern.compile(regex); //3、按照pattern的规则,到str当中获取数据 Matcher matcher = pattern.matcher(str); while (matcher.find()) { String group = matcher.group(index); list.add(group); } return list; } /* * 作用: * 从网络中爬取数据,把数据拼接成字符串返回 * 形参: * 网址 * 返回值: * 爬取到的所有数据 * */ public static String webCrawler(String net) throws IOException { //1、定义StringBuilder拼接爬取到的数据 StringBuilder sb = new StringBuilder(); //2、创建一个URL对象 URL url = new URL(net); //3、链接上这个网址 //细节:保证网络是通畅的,而且这个网址是可以链接上的 URLConnection conn = url.openConnection(); //4、读取数据 InputStreamReader isr = new InputStreamReader(conn.getInputStream()); int ch; while ((ch = isr.read()) != -1) { sb.append((char) ch); } //5、释放资源 isr.close(); //6、把读取到的数据返回 return sb.toString(); } }