【Java】制造假数据(网页爬取)

例如,如果我要随机点名,那么同学的姓名需要在记事本中提前准备好。

如果这些名字让你随便写,肯定很多同学都写不出什么花样。

例如:张三、李四、王五、赵六、孙七、周八…

这些就是假数据,是我们胡编乱造的虚假数据,虽然这些数据是胡编乱造的,但是在开发中,这些数据尽可能要与实际的情况相吻合。

image-20240505133110343

制造假数据的方式有很多,先来介绍第一种:网络爬取。

制造假数据:
    获取姓氏:https://hanyu.baidu.com/shici/detail?pid=0b2f26d4c0ddb3ee693fdb1137ee1b0d&from=kg0
    获取男生名字:http://www.haoming8.cn/baobao/10881.html(但是只有名,没有姓)
    获取女生名字:http://www.haoming8.cn/baobao/7641.html(但是只有名,没有姓)

当数据爬取完毕后,将姓氏和名字拼起来,出来的就是我们现在想要的数据。

image-20240505133427363 image-20240505133448990

网络爬虫

一、代码分析

familyName 表示姓氏,后面加个 Net ,表示网址记录的是姓氏。

public static void main(String[] args) throws IOException {
    //1.定义变量记录网址
    String familyNameNet = "https://hanyu.baidu.com/shici/detail?pid=0b2f26d4c0ddb3ee693fdb1137ee1b0d&from=kg0";
    String boyNameNet = "http://www.haoming8.cn/baobao/10881.html";
    String girlNameNet = "http://www.haoming8.cn/baobao/7641.html";

    //2.爬取数据,把网址上所有的数据拼接成一个字符串
    //由于要爬取三次,因此定义成方法,后面调用三次即可。
    //familyName:表示里面装的是所有的姓氏。Str:并且它是以字符串的姓氏来进行表示的
    String familyNameStr = webCrawler(familyNameNet);
    String boyNameStr = webCrawler(boyNameNet);
    String girlNameStr = webCrawler(girlNameNet);

    System.out.println(familyNameStr);
    // System.out.println(boyNameStr);
    // System.out.println(girlNameStr);

}

/*
* crawler:爬虫
* 作用:
*   从网络中爬取数据,把数据拼接成字符串返回
* 形参:
*   网址
* 返回值:
*   爬取到的所有数据
* */
public static String webCrawler(String net) throws IOException {
    //1.定义StringBuilder拼接爬取到的数据
    StringBuilder sb = new StringBuilder();
    //2.创建一个URL对象,url就表示网址的对象
    URL url = new URL(net);
    //3.链接上这个网址
    //细节:必须保证网络是畅通的,而且这个网址是可以链接上的。
    URLConnection conn = url.openConnection();
    //4.读取数据
    //getInputStream():获取到输入流,网址上所有的数据通过这个输入流就能读到了
    //但是InputStream是一个字节流,由于在网址上有可能会有中文,这个中文就不能用字节流去读了,因为可能会乱码。因此我们需要将字节流进行转换,转换为字符流
    InputStreamReader isr = new InputStreamReader(conn.getInputStream());
    int ch;
    while ((ch = isr.read()) != -1){
        sb.append((char)ch);
    }
    //5.释放资源
    isr.close();
    //6.把读取到的数据返回
    return sb.toString();
}

运行代码,我们来看一看我们现在爬取到的到底是什么。

因为它爬取到的数据相对来讲比较复杂,我们一个一个来看,先来看第一个:familyNameStr

运行代码,可以看见浏览器上的数据都爬取出来了。

在这些爬取出来的数据,里面包含了我们所有想要的姓氏。

image-20240505135553215

接下来看第二个爬取到的网址

// System.out.println(familyNameStr);
System.out.println(boyNameStr);
// System.out.println(girlNameStr);

可以发现运行结果也是一样的,它里面有所有的东西。

image-20240505135749970

但是我不是所有东西都要,我只要里面的名字。


二、爬取姓氏

接下来需要通过正则表达式,将其中符合要求的数据获取出来。

并且我是想在三个网址中都进行获取,因此我们还需要来写一个方法 getData(),表示获取数据的意思。

//3.通过正则表达式,把其中符合要求的数据获取出来
//familyNameTempList里面记录的都是姓名,只不过这个集合是临时的,所以加了一个Temp,也就是说我们拿到这个临时的集合后,还需要将它再进行处理
ArrayList<String> familyNameTempList = getData(familyNameStr,"正则表达式");
ArrayList<String> boyNameTempList = getData(boyNameStr,"正则表达式");
ArrayList<String> girlNameTempList = getData(girlNameStr,"正则表达式");

/*
* 作用:根据正则表达式获取字符串中的数据
* 参数一:
*       完整的字符串
* 参数二:
*       正则表达式
* 参数三:
*      ???? 第三个参数现在还不确定
*
* 返回值:
*       真正想要的数据
* */
private static ArrayList<String> getData(String str, String regex, ???) {
    //1.创建集合存放数据
    ArrayList<String> list = new ArrayList<>();
    //2.按照正则表达式的规则,去获取数据
    Pattern pattern = Pattern.compile(regex);
    //按照pattern的规则,到str当中获取数据
    Matcher matcher = pattern.matcher(str);
    while (matcher.find()){
        System.out.println(m.group());
    }
    return list;
}

接下来就需要先将正则表达式写出来。

正则表达式该如何写呢?你要获取什么,就写谁的正则表达式。

思考:我要获取的是这些姓氏,像下面的这些说明性的文字我其实是不要的,因此我需要写这些数据的正则表达式。

观察发现,每一句都是任意的四个汉字,然后中间用逗号或者句话隔开。我们就可以利用这个特点去写正则表达式。

image-20240505140658920
ArrayList<String> familyNameTempList = getData(familyNameStr,".{4}(,|。)");

先爬取一下试试,可以发现都爬取出来了。但

image-20240505143555196

是逗号跟句号我不要怎么办?也就是说在上面这个正则表达式中,我只需要获取前面这一部分。因此可以将前面的数据括起来,将它当成第一组,后面一个括号当成第二组。

因此这个方法的后面就可以加上第三个参数,第三个参数就表示正则表达式中的第几组,如果传0,表示要获取这里完整的数据;1

ArrayList<String> familyNameTempList = getData(familyNameStr,"(.{4})(,|。)");

接下来完善 getData(),index写在 group()

/*
* 作用:根据正则表达式获取字符串中的数据
* 参数一:
*       完整的字符串
* 参数二:
*       正则表达式
* 参数三:
*      获取数据
*       0:获取符合正则表达式所有的内容
*       1:获取正则表达式中第一组数据
*       2:获取正则表达式中第二组数据
*       ...以此类推
*
* 返回值:
*       真正想要的数据
*
* */
private static ArrayList<String> getData(String str, String regex,int index) {
    //1.创建集合存放数据
    ArrayList<String> list = new ArrayList<>();
    //2.按照正则表达式的规则,去获取数据
    Pattern pattern = Pattern.compile(regex);
    //按照pattern的规则,到str当中获取数据
    Matcher matcher = pattern.matcher(str);
    while (matcher.find()){
        list.add(matcher.group(index));
    }
    return list;
}

重新运行,此时所有的名字已经都获取到了

image-20240505144128736

但是此时它还是四个字连在一次,等会我们需要将它们分开,因此 familyNameTempList 只是一个临时的集合。


三、爬取男神名字

正则表达式该怎么写呢?

我们需要打开网址,来查看我们需要爬取数据的特点。

可以看见名字都是两个汉字,在后面是以中文的顿号或者中文的句话结尾

image-20240505153604504
ArrayList<String> boyNameTempList = getData(boyNameStr, "(..)(、|。)", 1);

但是这样其实还不行,打印集合看看,可以发现,不仅名字被爬取出来了,还有一些我们不需要的东西也被爬取出来了

、日 也是满足正则表达式要求的,因此我们需要继续修改正则。

image-20240505154020392

此时就要来想,这里就不能获取任意的数据了,只有前面是中文才能获取。

那中文在字符编码中的范围是多少呢?此时我们就可以使用之前分享过的 any-rule 插件。

然后在插件中输入 中文,双击点一下即可。

image-20240505154440130
ArrayList<String> boyNameTempList = getData(boyNameStr,"([\\u4E00-\\u9FA5]{2})(、|。)",1);
image-20240505154623432

四、爬取女生名字

打开浏览器(http://www.haoming8.cn/baobao/7641.html),查看我们需要爬取数据的规律。

有的人说:可以以空格结尾,或者回车结尾。

当然不能这样爬取,因为这样符合要求的太多了,凡是有空格或者回车的,都会把它收录进来!

我们可以换种思路:将一整行数据看做是一个元素进行爬取。

image-20240505154818917
ArrayList<String> girlNameTempList = getData(girlNameStr,"(.. ){4}..", 0);

五、数据处理

1)姓

familyNameTempList 集合中,是每四个姓当做是一个元素。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但是这不是我们想要的,我们想要的是将里面每一个姓都拆开放到一个新的集合中。

//4.处理数据
//familyNameTempList(姓氏)
//处理方案:把每一个姓氏拆开并添加到一个新的集合当中
ArrayList<String> familyNameList = new ArrayList<>();
for (String str : familyNameTempList) {
    //str 赵钱孙李  周吴郑王   冯陈褚卫   蒋沈韩杨
    for (int i = 0; i < str.length(); i++) {
        char c = str.charAt(i);
        familyNameList.add(c + "");
    }
}

2)男生的名字

boyNameTempList 集合中,可以发现这些数据我们不需要做什么处理,直接就可以拿过来用。

但是发现有些数据是重复的,因此我们只需要将它做一个去重就行了。

image-20240505160456543

去重我们有很多的办法,例如创建一个HashSet集合,或者创建ArrayList集合,当数据往集合中添加的时候判断一下

//boyNameTempList(男生的名字)
//处理方案:去除其中的重复元素
ArrayList<String> boyNameList = new ArrayList<>();
for (String str : boyNameTempList) {
    if(!boyNameList.contains(str)){
        boyNameList.add(str);
    }
}

3)女生的名字

可以发现女生的姓名是每五个为一组,名字跟名字之间用空格进行了隔开

//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]);
    }
}

六、生成数据

需求:姓名(唯一)-性别-年龄(随机)

这里定义一个方法,在方法中完成这个需求。

//5.生成数据
//姓名(唯一)-性别-年龄
ArrayList<String> list = getInfos(familyNameList, boyNameList, girlNameList, 70, 50);
Collections.shuffle(list);

/*
* 作用:
*      获取男生和女生的信息:张三-男-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));
    }
    //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));
    }
    //3.生成男生的信息并添加到集合当中
    ArrayList<String> list = new ArrayList<>();
    Random r = new Random();
    //【18 ~ 27】
    for (String boyName : boyhs) {
        //boyName依次表示每一个男生的名字
        int age = r.nextInt(10) + 18;
        list.add(boyName + "-男-" + age);
    }
    //4.生成女生的信息并添加到集合当中
    //用来生成任意数到任意数之间的随机数 例如7 ~15
    //1.让这个范围头尾都减去一个值,让这个范围从0开始  -7   0~8
    //2.尾巴+1       8 + 1 = 9
    //3.最终的结果,再加上第一步减去的值。 r.nextInt(9) + 7;// 7 ~ 15
    //这里要生成的是【18 ~ 25】
    for (String girlName : girlhs) {
        //girlName依次表示每一个女生的名字
        int age = r.nextInt(8) + 18;
        list.add(girlName + "-女-" + age);
    }
    return list;
}

七、写出数据

//6.写出数据
BufferedWriter bw = new BufferedWriter(new FileWriter("myiotest\\names.txt"));
for (String str : list) {
    bw.write(str);
    bw.newLine();
}
bw.close();

八、完整代码

public static void main(String[] args) throws IOException {
    /*
     制造假数据:
         获取姓氏:https://hanyu.baidu.com/shici/detail?pid=0b2f26d4c0ddb3ee693fdb1137ee1b0d&from=kg0
         获取男生名字:http://www.haoming8.cn/baobao/10881.html
         获取女生名字:http://www.haoming8.cn/baobao/7641.html
    */

    //1.定义变量记录网址
    String familyNameNet = "https://hanyu.baidu.com/shici/detail?pid=0b2f26d4c0ddb3ee693fdb1137ee1b0d&from=kg0";
    String boyNameNet = "http://www.haoming8.cn/baobao/10881.html";
    String girlNameNet = "http://www.haoming8.cn/baobao/7641.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) {
        //str 赵钱孙李  周吴郑王   冯陈褚卫   蒋沈韩杨
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            familyNameList.add(c + "");
        }
    }
    //boyNameTempList(男生的名字)
    //处理方案:去除其中的重复元素
    ArrayList<String> boyNameList = new ArrayList<>();
    for (String str : boyNameTempList) {
        if(!boyNameList.contains(str)){
            boyNameList.add(str);
        }
    }
    //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]);
        }
    }

    //5.生成数据
    //姓名(唯一)-性别-年龄
    ArrayList<String> list = getInfos(familyNameList, boyNameList, girlNameList, 70, 50);
    Collections.shuffle(list);


    //6.写出数据
    BufferedWriter bw = new BufferedWriter(new FileWriter("myiotest\\names.txt"));
    for (String str : list) {
        bw.write(str);
        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));
    }
    //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));
    }
    //3.生成男生的信息并添加到集合当中
    ArrayList<String> list = new ArrayList<>();
    Random r = new Random();
    //【18 ~ 27】
    for (String boyName : boyhs) {
        //boyName依次表示每一个男生的名字
        int age = r.nextInt(10) + 18;
        list.add(boyName + "-男-" + age);
    }
    //4.生成女生的信息并添加到集合当中
    //【18 ~ 25】
    for (String girlName : girlhs) {
        //girlName依次表示每一个女生的名字
        int age = r.nextInt(8) + 18;
        list.add(girlName + "-女-" + age);
    }
    return list;
}



/*
* 作用:根据正则表达式获取字符串中的数据
* 参数一:
*       完整的字符串
* 参数二:
*       正则表达式
* 参数三:
*      获取数据
*       0:获取符合正则表达式所有的内容
*       1:获取正则表达式中第一组数据
*       2:获取正则表达式中第二组数据
*       ...以此类推
*
* 返回值:
*       真正想要的数据
*
* */
private static ArrayList<String> getData(String str, String regex,int index) {
    //1.创建集合存放数据
    ArrayList<String> list = new ArrayList<>();
    //2.按照正则表达式的规则,去获取数据
    Pattern pattern = Pattern.compile(regex);
    //按照pattern的规则,到str当中获取数据
    Matcher matcher = pattern.matcher(str);
    while (matcher.find()){
        list.add(matcher.group(index));
    }
    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();
}

利用糊涂包生成假数据

之前的代码我们写了很多,那第三方工具中有没有什么现成的方法呢?

其实是有的,在糊涂包中有一个现成的方法帮助我们爬取数据,而且它也有现成的方法帮助我们利用正则表达式进行解析。

因此向这种 webCraler()getData() 两个方法,可以直接调用jar包中的方法。

那我们该如何找到方法呢?

例如我们要找跟爬取相关的,来看看它的代码是怎么写的。

它里面有一个工具类 HttpUtil,里面有一个静态方法 get(),将网址传递过去,它就可以将网址中所有的数据都拼接成字符串给你返回了。

拿到数据后,再根据正则表达式获取到里面想要的数据(参数为:正则表达式、字符串、正则表达式里面的第几组),方法返回一个集合。

ReUtil 中的 ReRegex 的前面两个字母。

findAll() 返回的是一个 List集合,它是以多态的形式进行返回的,在底层它真正创建的还是一个 ArrayList集合

image-20240505165326806

如果一定要转为ArrayList,那么只需要强转一下就行了,或者不强转,直接使用List接收也行。

两种方法都行,看你自己喜欢哪种。

image-20240505164626239

接下来就可以改造代码了。

细节:糊涂包的相对路径,不是相对于当前项目而言的,而是相对class文件而言的。(结合下面写出数据的代码看)

image-20240505170301990
public static void main(String[] args){
    //利用糊涂包生成假数据,并写到文件当中

    //1. 定义网址
    String familyNameNet = "https://hanyu.baidu.com/shici/detail?pid=0b2f26d4c0ddb3ee693fdb1137ee1b0d&from=kg0";
    String boyNameNet = "http://www.haoming8.cn/baobao/10881.html";
    String girlNameNet = "http://www.haoming8.cn/baobao/7641.html";

    //2.爬取数据
    String familyNameStr = HttpUtil.get(familyNameNet);
    String boyNameStr = HttpUtil.get(boyNameNet);
    String girlNameStr = HttpUtil.get(girlNameNet);

    //3.利用正则表达式获取数据
    //通过正则表达式,把其中符合要求的数据获取出来
    List<String> familyNameTempList = ReUtil.findAll("(.{4})(,|。)", familyNameStr, 1);
    List<String> boyNameTempList = ReUtil.findAll("([\\u4E00-\\u9FA5]{2})(、|。)", boyNameStr, 1);
    List<String> girlNameTempList = ReUtil.findAll("(.. ){4}..", girlNameStr, 0);

    System.out.println(familyNameTempList);
    System.out.println(boyNameTempList);
    System.out.println(girlNameTempList);

    //4.处理数据
    //familyNameTempList(姓氏)
    //处理方案:把每一个姓氏拆开并添加到一个新的集合当中
    ArrayList<String> familyNameList = new ArrayList<>();
    for (String str : familyNameTempList) {
        //str 赵钱孙李  周吴郑王   冯陈褚卫   蒋沈韩杨
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            familyNameList.add(c + "");
        }
    }
    //boyNameTempList(男生的名字)
    //处理方案:去除其中的重复元素
    ArrayList<String> boyNameList = new ArrayList<>();
    for (String str : boyNameTempList) {
        if(!boyNameList.contains(str)){
            boyNameList.add(str);
        }
    }
    //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]);
        }
    }

    //5.生成数据
    //姓名(唯一)-性别-年龄
    ArrayList<String> list = getInfos(familyNameList, boyNameList, girlNameList, 70, 50);
    Collections.shuffle(list);

    //6.写出数据
    //细节:糊涂包的相对路径,不是相对于当前项目而言的,而是相对class文件而言的
    FileUtil.writeLines(list, "names.txt", "UTF-8");

}

/*
 * 作用:
 *      获取男生和女生的信息:张三-男-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));
    }
    //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));
    }
    //3.生成男生的信息并添加到集合当中
    ArrayList<String> list = new ArrayList<>();
    Random r = new Random();
    //【18 ~ 27】
    for (String boyName : boyhs) {
        //boyName依次表示每一个男生的名字
        int age = r.nextInt(10) + 18;
        list.add(boyName + "-男-" + age);
    }
    //4.生成女生的信息并添加到集合当中
    //【18 ~ 25】
    for (String girlName : girlhs) {
        //girlName依次表示每一个女生的名字
        int age = r.nextInt(8) + 18;
        list.add(girlName + "-女-" + age);
    }
    return list;
}
  • 14
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值