File size: 7,179 Bytes
0284885 | 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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 | 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();
}
}
|