zxy0307's picture
Upload 2300 files
0284885 verified
Raw History Blame Contribute Delete
7.18 kB
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<String> familyNameTempList = getData(familyNameStr, "(.{4})(,|。)", 1);
ArrayList<String> boyNameTempList = getData(boyNameStr, "([\\u4e00-\\u9fa5]{2})(、|。)", 1);
ArrayList<String> girlNameTempList = getData(girlNameStr, "(.. ){4}..", 0);
//4、处理数据
//familyNameTempList(姓氏)
//处理方案:把每一个姓氏拆开并添加到一个新的集合当中
ArrayList<String> 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<String> boyNameList = new ArrayList<>();
for (String str : boyNameTempList) {
if (!boyNameList.contains(str)) {
boyNameList.add(str);
}
}
//System.out.println(boyNameList);
//girlNameTempList(女生的姓名)
//处理方案:把里面的每一个元素用空格进行切割,得到每一个女生的名字
ArrayList<String> 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<String> 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<String> getInfos(ArrayList<String> familyNameList, ArrayList<String> boyNameList, ArrayList<String> girlNameList, int boyCount, int girlCount) {
//1、生成男生不重复的名字
HashSet<String> 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<String> 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<String> 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<String> getData(String str, String regex, int index) {
//1、创建集合存放数据
ArrayList<String> 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();
}
}