JavaSE练习题(下)

目录

第十三章

第一题

第二题

第三题

第四题

第五题

第十四章

第一题

第二题

第三题

第四题

第五题

第六题

​第十五章

代码编程题

第一题

第二题

第三题

第四题

第五题

第六题

第七题

第八题

第九题

第十题

第十一题

第十二题

第十三题

代码阅读题

第十四题

第十五题

第十六题

第十七题

第十八题

第十九题

第二十题

第十六章

泛型练习题

第一题

第二题

第三题

第四题

第五题

集合练习题

第一题

第二题

第十七章

第一题

第二题

第三题

第四题

第五题

第六题

第七题

第八题

第十八章

第一题

第二题

第三题

第四题

第五题

第六题

第十九章

文件操作

第一题

第二题

IO流操作

第三题

第四题

第五题

第六题

第七题

递归

第八题

第九题

第十题

第十一题

第十二题

第二十章

第一题

第二题

第三题

第四题

第二十一章

第一题

第二题

第三题

第四题

第二十二章

第一题

第二题

第三题

第四题

第五题

第六题

第七题

第八题

第九题

第十题


第十三章

第一题

案例:在子线程中输出1-100之间的偶数,主线程输出1-100之间的奇数。

效果如下:

package com.atguigu.test01;
​
public class Test01 {
    public static void main(String[] args) {
        new Thread("子线程"){
            public void run(){
                for (int i = 0; i <= 100; i+=2) {
                    System.out.println(getName() + "-->" + i);
                }
            }
        }.start();
        
        for (int i = 1; i <= 100; i+=2) {
            System.out.println("main主线程 -->" + i);
        }
    }
}
​

第二题

案例:创建和启动2个子线程,一个打印1-10之间奇数,一个打印1-10之间偶数。

(1)要求每个线程要么不打印,要么就连续打印5个数,每个数打印间隔500毫秒

(2)但两个线程不要求交替打印。

效果如下:

package com.atguigu.test02;
​
public class Test02 {
    public static void main(String[] args) {
        new PrintEven().start();
        new PrintOdd().start();
    }
}
class PrintEven extends Thread{
    private int num = 1;
    public void run(){
        while(true){
            synchronized (Thread.class) {
                for (int i = 1; i <= 5; i++) {
                    num+=2;
                    System.out.println("偶数线程,第" + i + "个:" + num);
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
            
        }
    }
}
class PrintOdd extends Thread{
    private int num = 2;
    public void run(){
        while(true){
            synchronized (Thread.class) {
                for (int i = 1; i <= 5; i++) {
                    num+=2;
                    System.out.println("奇数线程,第" + i + "个:" + num);
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}

第三题

案例:创建和启动2个子线程,一个打印奇数,一个打印偶数。

(1)要求实现交替打印。

(2)每个数打印间隔1秒

效果如下:

package com.atguigu.test03;
​
public class Test03 {
    public static void main(String[] args) {
        new PrintNumber().start();
        new PrintNumber().start();
    }
}
class PrintNumber extends Thread{
    private static int num;
    public void run(){
        while(true){
            synchronized (PrintNumber.class) {
                try {
                    PrintNumber.class.notify();
                    Thread.sleep(1000);
                    System.out.println(getName() + ":" + ++num); 
                    PrintNumber.class.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

第四题

案例:

1、创建一个银行账户类,

(1)属性:账号,余额,

(2)get/set,

(3)toString():返回:账户:xxx,余额:xxx

2、创建一个丈夫类

负责往里存钱,每次存款[0,10000)以内不等

3、创建一个妻子类

负责取钱,每次取款[0,10000)以内不等,如果余额不足,要等丈夫存够了才能取

package com.atguigu.test04;
​
public class Test04 {
    public static void main(String[] args) {
        Account a = new Account("1122",0);
        
        new Wife(a).start();
        new Husband(a).start();
    }
}
class Account{
    private String id;
    private double balance;
    public Account(String id, double balance) {
        super();
        this.id = id;
        this.balance = balance;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public double getBalance() {
        return balance;
    }
    public void setBalance(double balance) {
        this.balance = balance;
    }
    @Override
    public String toString() {
        return "账户:" + id + ",余额:" + balance ;
    }
}
class Wife extends Thread{
    private Account account;
    
    public Wife(Account account) {
        super();
        this.account = account;
    }
​
    public void run(){
        while(true){
            synchronized (Thread.class) {
                double money = Math.random() * 10000;
                while(money > account.getBalance()){
                    System.out.println("本次妻子想取钱:" + money +",但是余额不足,等待...");
                    try {
                        Thread.class.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("妻子开始取钱,目前账户状态:" + account);
                System.out.println("本次妻子取钱:" + money);
                account.setBalance(account.getBalance() - money);
                System.out.println("妻子取钱结束,目前账户状态:" + account);
                System.out.println();
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            
        }
    }
}
class Husband extends Thread{
    private Account account;
    
    public Husband(Account account) {
        super();
        this.account = account;
    }
​
    public void run(){
        while(true){
            synchronized (Thread.class) {
                double money = Math.random() * 10000;
                System.out.println("丈夫开始存钱,目前账户状态:" + account);
                System.out.println("本次丈夫存钱:" + money);
                account.setBalance(account.getBalance() + money);
                System.out.println("丈夫开始结束,目前账户状态:" + account);
                System.out.println();
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                Thread.class.notify();
            }
            
        }
    }
}

第五题

案例:请按要求编写多线程应用程序,模拟多个人通过一个山洞:

1、这个山洞每次只能通过一个人,每个人通过山洞的时间为5秒;

2、随机生成10个人,同时准备过此山洞

3、定义一个变量用于记录通过隧道的人数

4、显示每次通过山洞人的姓名,和通过顺序;

操作步骤描述

1.定义一个隧道类,实现Runnable接口:

        1.1 定义一个变量,用来记录通过隧道的人数;

        1.2 重写Runnable的run方法;

        1.3 定义一个同步方法,模拟每个人通过隧道需要5秒钟:

                1.3.1 打印“xx开始通过隧道...”

                1.3.2 子线程睡眠5秒钟,模拟每个人通过隧道需要5秒钟;

                1.3.3 改变通过的人次;

                1.3.4 打印线程名称及其通过隧道的顺序,模拟人通过隧道及其顺序;

        1.4 调用通过隧道的方法;

2.定义一个测试类:

        2.1.在main方法中创建一个隧道类对象;

        2.2.在main方法中,循环创建10个子线程对象,通过构造方法把隧道对象

和线程名(作为人的姓名)传递进去,并开启子线程;

package com.atguigu.test05;
​
public class Tunnel implements Runnable {
    // 1.1 定义一个变量,用来记录通过隧道的人数
    private int crossNum = 0;
​
    /*
     * 1.2 重写Runnable的run方法
     */
    @Override
    public void run() {
        // 1.4 调用通过隧道的方法
        cross();
    }
​
    /*
     * 1.3 定义一个同步方法,模拟每个人通过隧道需要5秒钟
     */
    public synchronized void cross() {
        //1.3.1 打印 xx开始通过隧道...
        System.out.println(Thread.currentThread().getName() + "开始通过隧道...");
        // 1.3.2 子线程睡眠5秒钟,模拟每个人通过隧道需要5秒钟
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // 1.3.3 改变通过的人次
        crossNum++;
        // 1.3.4 打印线程名称及其通过隧道的顺序,模拟人通过隧道及其顺序
        System.out.println(Thread.currentThread().getName() + "已经通过隧道,TA是第" + crossNum + "通过的!");
    }
}
​
package com.atguigu.test05;
​
public class Test05 {
    public static void main(String[] args) {
        // 2.1 在main方法中创建一个隧道类对象
        Tunnel tul = new Tunnel();
​
        // 2.2 在main方法中,循环创建10个子线程对象,通过构造方法把隧道对象和// 线程名(作为人的姓名)传递进去,并开启子线程
        for (int i = 1; i <= 10; i++) {
            Thread t = new Thread(tul, "p" + i);
            t.start();
        }
    }
}

第十四章

第一题

有一个数组a[1000]存放0-999,要求每隔二个数删掉一个数,到末尾时循环至开头,继续运行。求最后一个被删掉的数的原始下标位置。

以8个数为例:

{0,1,2,3,4,5,6,7}:0->1->2(删掉)->3->4->5(删掉)->6->7->0(删掉)。。。

/*
 * 有一个数组a[1000]存放0-999,要求每隔二个数删掉一个数,到末尾时循环至开头,继续运行。求最后一个被删掉的数的原始下标位置。
​
以8个数为例:
​
{0,1,2,3,4,5,6,7}:0->1->2(删掉)->3->4->5(删掉)->6->7->0(删掉)。。。
 */
public class TestHomework1 {
    public static void main(String[] args) throws InterruptedException {
        int[] a = new int[1000];
        for (int i = 0; i < a.length; i++) {
            a[i] = i;
        }
        
        int i=0;
        int count = 0;
        int delNum = 0;//被删掉的数字个数
        while(true) {
            if(a[i]!=-1) {//被删掉的数不再计入count个数
                count++;
            }
            if(count==3) {//隔两个,第三个删掉
                a[i]=-1;//a[i]=-1,表示被删掉的数
                count=0;//count重新计数
                delNum++;//统计已经被删掉几个了
            }
            if(delNum==a.length-1) {//留下最后一个结束删除过程
                break;
            }
            if(++i==a.length) {//如果下标右移已经到头了,要从头开始
                i=0;
            }
        }
        
        for (int j = 0; j < a.length; j++) {
            if(a[j]!=-1) {
                System.out.println("最后一个被删掉的数是:a[j]=" + a[j] + ",它的下标:" + j);
            }
        }
    }
}

第二题

public static int binarySearch(int[] intsArray, int des) {
        int left = 0;
        int right = intsArray.length-1;
        int mid = (left + right)/2;
        while(left<=right) {
            if(intsArray[mid]==des) {
                return mid;
            }else if(des>intsArray[mid]){
                left = mid+1;
            }else {
                right=mid-1;
            }
            mid = (left + right)/2;
        }
        return -1;
    }

第三题

public static int binarySearch(String[] intsArray, String des) {
        int left = 0;
        int right = intsArray.length-1;
        int mid = (left + right)/2;
        while(left<=right) {
            if(intsArray[mid].equals(des)) {
                return mid;
            }else if(des.compareTo(intsArray[mid])>0){//字符串比较大小的方法
                left = mid+1;
            }else {
                right=mid-1;
            }
            mid = (left + right)/2;
        }
        return -1;
    }

第四题

public static void main(String[] args) throws InterruptedException {
        System.out.println(Arrays.toString(suShu(10)));
    }
    
    public static int[] suShu(int n){
        int[] arr = new int[n];
        
        int index=0;
        for (int i = 1; i < n; i++) {
            boolean flag = true;
            for (int j = 2; j < i; j++) {
                if(i%j==0) {
                    flag=false;
                    break;
                }
            }
            if(flag) {
                arr[index++] = i;
            }
        }
        return Arrays.copyOf(arr, index);
    }

第五题

public static void main(String[] args) throws InterruptedException {
        int[] arr = {1,2,3,4,5,6,7};
        arr = changPosition(1,5,arr);
        System.out.println(Arrays.toString(arr));
    }
    
    public static int[] changPosition(int n1,int n2,int[] ii) {
        int indexN1=-1;
        for (int i = 0; i < ii.length; i++) {
            if(ii[i]==n1) {
                indexN1 = i;
                break;
            }
        }
        int indexN2 = -1;
        for (int i = 0; i < ii.length; i++) {
            if(ii[i]==n2) {
                indexN2 = i;
                break;
            }
        }
        System.arraycopy(ii, indexN1+1, ii, indexN1, indexN2-indexN1);
        ii[indexN2]=n1;
        return ii;
    }

第六题

import java.util.Arrays;
​
public class TestHomework6 {
    public static void main(String[] args) {
        int[] arr = {0,1,2,3,4,5,6,7,8,9};
        
        int m = 10;
        for (int i = 0; i < m; i++) {
            move(arr);
            System.out.println(Arrays.toString(arr));
        }
        
        int value = 5;
        System.out.println(indexOf(arr, m, value));
    }
    
    public static int indexOf(int[] arr,int m, int value) {
        while(m>arr.length) {
            m = m - arr.length;
        }
        if(value == arr[0]) {
            return 0;
        }else if(value > arr[0]) {
            return Arrays.binarySearch(arr, 1, m, value);
        }else {
            return Arrays.binarySearch(arr, m, arr.length, value);
        }
    }
    
    public static void move(int[] arr) {
        int temp = arr[arr.length-1];
        System.arraycopy(arr, 0, arr, 1, arr.length-1);
        arr[0] = temp;
    }
}

​第十五章

代码编程题

第一题

  • 反转键盘录入的字符串。

  • 代码实现,参考效果如图所示:

package com.atguigu.test01;
​
import java.util.Scanner;
​
public class Test01 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.print("请键盘输入字符串:");
        String str = input.next();
        
        StringBuilder s = new StringBuilder(str);
        str = s.reverse().toString();
        System.out.println("反转后:" + str);
        input.close();
    }
}
​

第二题

  • 键盘录入QQ号码,验证格式的正确性。

    • 必须是5—12位数字。

    • 0不能开头。

  • 代码实现,参考效果如图所示:

package com.atguigu.test02;
​
import java.util.Scanner;
​
public class Test02 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.print("请输入qq号码:");
        String qq = input.next();
        
        System.out.print("这个qq号是否正确:");
        if(qq.matches("[1-9][0-9]{4,11}+")){
            System.out.println(true);
        }else{
            System.out.println(false);
        }
        input.close();
    }
}

第三题

  • 字符串查找。

    • 键盘录入一个大字符串,再录入一个小字符串。

    • 统计小字符串在大字符串中出现的次数。

  • 代码实现,效果如图所示:

package com.atguigu.test03;
​
import java.util.Scanner;
​
public class Test03 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.print("请输入大字符串:");
        String big = input.next();
        
        System.out.print("请输入小字符串:");
        String small = input.next();
        
        int index;
        int count = 0;
        while((index = big.indexOf(small))!=-1){
            big = big.substring(index+small.length());
            count++;
        }
        System.out.println(small + "出现了" +count + "次");
        
        input.close();
    }
}
​

第四题

  • 替换某字符串中的某字符串。

    • 键盘录入一个srcStr字符串,再录入一个delStr字符串。

    • 删除该字srcStr符串中的所有delStr字符串。

    • 并且统计delStr字符串在srcStr中出现的次数

  • 代码实现,部分效果如图所示:

package com.atguigu.test04;
​
import java.util.Scanner;
​
public class Test04 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        
        System.out.print("请输入原字符串:");
        String src = input.next();
        
        System.out.print("请输入要删除的字符串:");
        String del = input.next();
        
        String result = src.replaceAll(del, "");
        
        int count = (src.length() - result.length())/del.length();
        System.out.println(del+"共出现了:" + count + "次");
        System.out.println("删除" + del + "后字符串:" + result);
        
        input.close();
    }
}
​

第五题

  • 生成一个随机100内小数,转换为保留两位小数的字符串,不考虑四舍五入的问题。

  • 代码实现,效果如图所示:

package com.atguigu.test05;
​
public class Test05 {
    public static void main(String[] args) {
        double num = Math.random() * 100;
        System.out.println("随机数为:" +num);
        String str = num + "";
        str = str.substring(0,str.indexOf(".") + 3);
        System.out.println("截取小数点后两位后为:" + str);
    }
}

第六题

  • 筛选字符串。

    • 定义数组,存入多个字符串。

    • 删除长度大于5的字符串,打印删除后的数组。

  • 代码实现,效果如图所示:

package com.atguigu.test06;
​
import java.util.Arrays;
​
public class Test06 {
    public static void main(String[] args) {
        String[] arr = {"helloworld","java","chai","atguigu","lin","yan","Iloveyou"};
        
        System.out.println("原字符串:");
        System.out.println( Arrays.toString(arr));
        int index = 0;
        while(index < arr.length){
            if(arr[index].length()>5){
                System.arraycopy(arr, index+1, arr, index, arr.length-index-1);
                arr = Arrays.copyOf(arr, arr.length-1);
            }else{
                index++;
            }
        }
        System.out.println("删除后:");
        System.out.println(Arrays.toString(arr));
    }
}
​

第七题

  • 判断回文字符串。如果一个字符串,从前向后读和从后向前读,都是一个字符串,称为回文串,比如mom,dad,noon。

  • 代码实现,效果如图所示:

package com.atguigu.test07;
​
import org.junit.Test;
​
public class Test07 {
    @Test
    public void test01() {
        String str = "noon";
        System.out.println(str);
        StringBuilder s = new StringBuilder(str);
        String string = s.reverse().toString();
        System.out.print("回文数:");
        if(str.equals(string)){
            System.out.println(true);
        }else{
            System.out.println(false);
        }
    }
​
    @Test
    public void test02() {
        String str = "noon";
        System.out.println(str);
        char[] arr = str.toCharArray();
        boolean flag = true;
        for (int left = 0,right=arr.length-1; left <=right; left++,right--) {
            if(arr[left] != arr[right]){
                flag = false;
                break;
            }
        }
        System.out.print("回文数:");
        if(flag){
            System.out.println(true);
        }else{
            System.out.println(false);
        }
    }
}
 

第八题

  • 校验密码是否合法。

    • 必须至少9个字符。

    • 必须至少2个大写字符。

    • 必须包含小写字母和数字。

  • 代码实现,效果如图所示:

package com.atguigu.test08;
​
import org.junit.Test;
​
public class Test08 {
    @Test
    public void test01(){
        String password = "at1Gui2Gu";
        
        char[] arr = password.toCharArray();
        int upCount = 0;
        int numCount = 0;
        int lowerCount = 0;
        for (int i = 0; i < arr.length; i++) {
            if(arr[i]>='A' && arr[i]<='Z'){
                upCount++;
            }else if(arr[i]>='a' && arr[i]<='z'){
                lowerCount++;
            }else if(arr[i]>='0' && arr[i]<='9'){
                numCount++;
            }
        }
        System.out.print(password+"是否合法:");
        if(password.length() >=9 && upCount>=2 && numCount!=0 && lowerCount!=0){
            System.out.println(true);
        }else{
            System.out.println(false);
        }
        
    }
}
​

第九题

  • 模拟用户登录。

    • 定义用户类,属性为用户名和密码。

    • 使用数组存储多个用户对象。

    • 录入用户和密码,对比用户信息,匹配成功登录成功,否则登录失败。

    • 登录失败时,当用户名错误,提示没有该用户。

    • 登录失败时,当密码错误时,提示密码有误。

  • 代码实现,效果如图所示:

package com.atguigu.test09;

import java.util.Scanner;

public class Test09 {
	public static void main(String[] args) {
		User[] all = new User[3];
		all[0] = new User("atguigu","123");
		all[1] = new User("chailinyan","8888");
		all[2] = new User("java","6666");
		for (int i = 0; i < all.length; i++) {
			System.out.println(all[i]);
		}
		
		Scanner input =new Scanner(System.in);
		System.out.print("请输入用户名:");
		String username = input.next();
		System.out.print("请输入密码:");
		String password = input.next();
		
		boolean flag = false;
		for (int i = 0; i < all.length; i++) {
			if(all[i].getUsername().equals(username) && all[i].getPassword().equals(password)){
				flag = true;
				break;
			}
		}
		System.out.println("登录结果:" +flag);
		input.close();
	}
}
class User{
	private String username;
	private String password;
	public User(String username, String password) {
		super();
		this.username = username;
		this.password = password;
	}
	public User() {
		super();
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	@Override
	public String toString() {
		return username + "-" + password;
	}
	
}

第十题

  • 定义Handleable接口,具备一个处理字符串数字的抽象方法方法String handleString(String num);

    • 处理方式1:取整数部分。

    • 处理方式2:保留指定位小数,四舍五入。

  • 代码实现,效果如图所示:

开发提示:

  • 匿名内部类的方式,调用所有抽象方法。

 public class Test1 {
      
            public static void main(String[] args) {
      
                String str = "23.23456789";
                System.out.println("原数字字符串:" + str);
      
                HandleAble s1 = new HandleAble() {
                    @Override
                    public String handleString(String str) {
                        return str.substring(0, str.indexOf("."));
                    }
                };
                String string = s1.handleString(str);
      
                System.out.println("取整后:" + string);
      
                int num = 4;
          
                HandleAble s2 = new HandleAble() {
                    @Override
                    public String handleString(String str) {
          
                        int i = str.indexOf(".") + num + 1;
                        char c = str.charAt(i);
                        //System.out.println(c);
          
                        if (c <= '4') {
                            return str.substring(0, i).toString();
                        } else {
                            char c1 = (char) (str.charAt(str.indexOf(".") + num) + 1);
                            return str.substring(0, i - 1) + c1;
          
                        }
                    }
                };
                String sss = s2.handleString(str);
                System.out.println("保留" + num + "位小数后:" + sss);
          
            }
        }
        interface HandleAble {
            public abstract String handleString(String str);
        }
      
————————————————
版权声明:本文为CSDN博主「小飞侠v科比」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/kai46385076/article/details/95678391

第十一题

案例:有一个字符串String abc = “342567891”,请写程序将字符串abc进行升序,可以使用JDK API中的现有的功能方法。

package com.atguigu.test11;

import java.util.Arrays;

public class Test11 {
	public static void main(String[] args) {
		String abc = "342567891";
		char[] arr = abc.toCharArray();
		Arrays.sort(arr);
		abc = new String(arr);
		System.out.println(abc);
	}
}

package com.atguigu.test10;

public interface Handleable {
	String handleString(String num);
}

package com.atguigu.test10;

import org.junit.Test;

public class Test01 {
	@Test
	public void test01(){
		String str = "23.23456789";
		System.out.println("原数字:" + str);
		/*
		str = new Handleable() {
			@Override
			public String handleString(String num) {
				//查找小数点.位置
				int index = num.indexOf(".");
				if(index != -1){
					num = num.substring(0, num.indexOf("."));
				}
				return num;
			}
		}.handleString(str);*/
        
        Handleable h = new Handleable() {
			@Override
			public String handleString(String num) {
				//查找小数点.位置
				int index = num.indexOf(".");
				if(index != -1){
					num = num.substring(0, num.indexOf("."));
				}
				return num;
			}
		};
        str = h.handleString(str);
		
		System.out.println("取整后:" + str);
	}
	@Test
	public void test03(){
		String str = "23.99996789";
		System.out.println("原数字:" + str);
		
		final int wei = 4;//截取到小数点后4位,四舍五入
		str = new Handleable() {
			@Override
			public String handleString(String num) {
				BigDecimal big = new BigDecimal(num);
				BigDecimal b = new BigDecimal("1");
				BigDecimal shang = big.divide(b, wei, BigDecimal.ROUND_HALF_UP);
				return shang.toString();
			}
		}.handleString(str);
		System.out.println(str);
	}

第十二题

案例:

已知一个字符串String str = "1、 hello 2. world 3. java 4.String 5. haha 6、HELLO";

要求统计出现次数最多的字母及其出现的次数。不区分大小写。

package com.atguigu.test12;

import org.junit.Test;

public class Test12 {
	@Test
	public void test1(){
		String str = "1、 hellao 2. world 3. java 4.String 5. haha 6、HELLO";
        
		//把字符串转为小写,因为不区分大小写,方便统计
		str = str.toLowerCase();
        //把里面的非字母去掉
        str = str.replaceAll("[^a-z]","");
		//转为字符数组
		char[] arr = str.toCharArray();
		//统计每个字母出现次数
		int[] counts = new int[26];//记录26个字母的次数
        /*
        counts[0]存'a'的次数   'a'=97  97-97->0
        counts[1]存'b'的次数   'b'=98  98-97->1
        */
		for (int i = 0; i < arr.length; i++) {
			counts[arr[i]-97]++;
		}
		
		//找最大值
		int max = counts[0];
		for (int i = 1; i < counts.length; i++) {
			if(max < counts[i]){
				max = counts[i];
			}
		}
		//打印最大值和字母
		for (int i = 0; i < counts.length; i++) {
			if(counts[i] == max){
                //i=0   'a'字母
                //i=1   'b'字母
				System.out.println(((char)(i+97)) + "出现了" + max + "次");
			}
		}
	}
	
}

第十三题

案例:已知字符串String str = "1.hello2.world3.java4.string";要求拆分出每一个单词,并遍历显示

package com.atguigu.test13;

public class Test13 {
	public static void main(String[] args) {
		String str = "1.hello2.world3.java4.string";
		//把开头的1.去掉
        str = str.replaceAll("^\\d\\.","");
		//按照数字.的格式进行拆分
		String[] split = str.split("\\d\\.");
		for (int i = 0; i < split.length; i++) {
			System.out.println(split[i]);
		}
	}
}

代码阅读题

第十四题

public static void main(String[] args) {
		String str = new String("world");
		char[] ch = new char[]{'h','e','l','l','o'};
		change(str,ch);
		System.out.println(str);
		System.out.println(String.valueOf(ch));
	}
	public static void change(String str, char[] arr){
		str = "change";
		arr[0] = 'a';
		arr[1] = 'b';
		arr[2] = 'c';
		arr[3] = 'd';
		arr[4] = 'e';
	}
package com.atguigu.test14;

public class Test14 {
	public static void main(String[] args) {
		String str = new String("world");
		char[] ch = new char[]{'h','e','l','l','o'};
		change(str,ch);
		System.out.println(str);//world
		System.out.println(String.valueOf(ch));//abcde
	}
	/*
	 * 方法的参数:引用数据类型传递的是对象地址
	 * 但是字符串对象不可变
	 */
	public static void change(String str, char[] arr){
		str = "change";
		arr[0] = 'a';
		arr[1] = 'b';
		arr[2] = 'c';
		arr[3] = 'd';
		arr[4] = 'e';
	}
}

第十五题

public class Test {
	int a;
	int b;
    String str;
	public void f(){
		a = 0;
		b = 0;
        str = "hello";
		int[] c = {0};
		g(b,c);
		System.out.println(a + " " + b + " " + c[0] + "," + str);
	}
	public void g(int b, int[] c,String s){
		a = 1;
		b = 1;
		c[0] = 1;
        s = "world";
	}
	public static void main(String[] args) {
		Test t = new Test();
		t.f();
	}
}
package com.atguigu.test17;

public class Test {
	int a;
	int b;
    String str;
	public void f(){
		a = 0;//成员变量  this.a--> t.a = 0
		b = 0;//成员变量 this.b --> t.b = 0
        str = "hello";//成员变量  this.str -> t.str = "hello"
		int[] c = {0}; //f()方法的局部变量,是一个数组
		g(b,c,str);//this.g(b,c,str);
		System.out.println(a + " " + b + " " + c[0] + "," + str);//101hello
	}
	/*
	 * 形参基本数据类型:传递数据值
	 * 形参引用数据类型:传递地址值,但是字符串对象不可变
	 */
	public void g(int b, int[] c,String s){
		a = 1;//修改成员变量  this.a -> t.a = 1
		b = 1;//修改形参b,局部变量,(1)和成员变量b无关,(2)因为b是基本数据类型,所以和实参b也无关
		c[0] = 1;//c是数组,是引用数据类型,修改元素会影响实参
        s = "world";//s是局部变量, 但是字符串对象不可变,和实参无关
	}
	public static void main(String[] args) {
		Test t = new Test();//t.a = 0, t.b = 0,  t.str = null
		t.f();
	}
}

第十六题

package com.atguigu.test18;

public class Test18 {
	/*
	 * 形参是引用数据类型,实参传递的是地址值
	 */
	private static void change(String s,StringBuffer sb){
		s = "aaaa";//字符串对象是不可变,一旦修改,就是新对象
		sb.setLength(0);//先把sb里面的内容给清空了
		sb.append("aaaa");//再拼接aaaa
	}
	
	
	public static void main(String[] args) {
		String s = "bbbb";
		StringBuffer sb = new StringBuffer("bbbb");
		change(s,sb);
		System.out.println(s+sb);//bbbbaaaa
	}
}

第十七题

package com.atguigu.test19;

public class Example {
	String str = new String("good");
	char[] ch = {'a','b','c'};
	
	public static void main(String[] args) {
		Example ex = new Example();//ex.str = good   ex.ch=  abc
		
		ex.change(ex.str,  ex.ch);
		System.out.print(ex.str + " and ");//good + and + gbc
		System.out.print(ex.ch);
	}
	
	public void change(String str, char[] ch){//形参和实参指向同一个数组
		str = "test ok";//字符串对象不可变,形参的修改,和实参无关
		ch[0] = 'g';//形参对元素的修改,直接修改的是实参元素的值
	}
}

第十八题

package com.atguigu.test20;

public class Test20 {
	public static void main(String[] args) {
		StringBuffer a = new StringBuffer("A");
		StringBuffer b = new StringBuffer("B");

		operate(a, b);

		System.out.println(a + "," + b);// AB , B
	}

	public static void operate(StringBuffer x, StringBuffer y) {
		x.append(y);// 等价于a拼接b x = AB
		y = x;// 一旦修改形参的地址值,那么就和实参无关了,即让形参重新指向新的对象了
        y.append('x');
	}
}

第十九题

package com.atguigu.test21;

class TEXT{
	public int num;
	public String str;
	
	public TEXT(int num, String str){
		this.num = num;
		this.str = str;
	}
}
public class Class4 {
    //tIn是传对象的地址,修改形参的属性,会影响实参
    //intIn是传数据,基本数据类型的形参修改和实参无关
    //Integer和String对象不可变
	public static void f1(TEXT tIn, int intIn, Integer integerIn, String strIn){
		tIn.num =200;
		tIn.str = "bcd";//形参和实参指向的是同一个TEXT的对象,修改了属性,就相当于修改实参对象的属性
		intIn = 200;//基本数据类型的形参是实参的“副本”,无论怎么修改和实参都没关系
		integerIn = 200;//Integer对象和String对象一样都是不可变,一旦修改都是新对象,和实参无关
		strIn = "bcd";
	}
	public static void main(String[] args) {
		TEXT tIn = new TEXT(100, "abc");//tIn.num = 100, tIn.str="abc"
		int intIn = 100;
		Integer integerIn = 100;
		String strIn = "abc";
		
		f1(tIn,intIn,integerIn,strIn);
		
		System.out.println(tIn.num + tIn.str + intIn + integerIn + strIn);
		//200 + bcd + 100 + 100 + abc
	}
}

第二十题

package com.atguigu.test22;

public class Test22 {
	/*
	 * GBK,UTF-8,ISO8859-1所有的字符编码都向下兼容ASCII码
	 */
	public static void main(String[] args) throws Exception {
		String str = "中国";
		System.out.println(str.getBytes("ISO8859-1").length);// 2
		// ISO8859-1把所有的字符都当做一个byte处理,处理不了多个字节
		System.out.println(str.getBytes("GBK").length);// 4 每一个中文都是对应2个字节
		System.out.println(str.getBytes("UTF-8").length);// 6 常规的中文都是3个字节

		/*
		 * 不乱码:(1)保证编码与解码的字符集名称一样(2)不缺字节
		 */
		System.out.println(new String(str.getBytes("ISO8859-1"), "ISO8859-1"));// 乱码
		System.out.println(new String(str.getBytes("GBK"), "GBK"));// 中国
		System.out.println(new String(str.getBytes("UTF-8"), "UTF-8"));// 中国
	}
}

第十六章

泛型练习题

第一题

案例:有如下四个学生的成绩:

(1)用Comparable接口对下列四位同学的成绩做降序排序,如果成绩一样,那在成绩排序的基础上按照年龄由小到大排序。请正确指定泛型

(2)用Comparator实现按照姓名排序,请正确指定泛型

效果如下

package com.atguigu.test01;
​
import java.util.Comparator;
import java.util.TreeSet;
​
public class Test01 {
    public static void main(String[] args) {
        System.out.println("按照成绩和年龄排序:");
        TreeSet<Student> set = new TreeSet<>();
        set.add(new Student("liusan",20,90.0));
        set.add(new Student("lisi",22,90.0));
        set.add(new Student("wangwu",20,99.0));
        set.add(new Student("sunliu",22,100.0));
        for (Student student : set) {
            System.out.println(student);
        }
        
        System.out.println("按照姓名排序:");
        TreeSet<Student> all = new TreeSet<>(new Comparator<Student>() {
​
            @Override
            public int compare(Student o1, Student o2) {
                return o1.getName().compareTo(o2.getName());
            }
        });
        all.addAll(set);
        
        for (Student student : all) {
            System.out.println(student);
        }
    }
}
class Student implements Comparable<Student>{
    private String name;
    private int age;
    private double score;
    public Student(String name, int age, double score) {
        super();
        this.name = name;
        this.age = age;
        this.score = score;
    }
    public Student() {
        super();
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public double getScore() {
        return score;
    }
    public void setScore(double score) {
        this.score = score;
    }
    @Override
    public String toString() {
        return "Student [name=" + name + ", age=" + age + ", score=" + score + "]";
    }
    @Override
    public int compareTo(Student stu) {
        if(this.getScore()>stu.getScore()){
            return -1;
        }else if(this.getScore() < stu.getScore()){
            return 1;
        }
        return this.getAge() - stu.getAge();
    }
    
}

第二题

案例:

1、声明一个坐标类Coordinate<T>,它有两个属性:x,y,都为T类型

2、在测试类中,创建两个不同的坐标类对象,分别指定T类型为String和Double,并为x,y赋值,打印对象

package com.atguigu.test02;
​
public class Test02 {
    public static void main(String[] args) {
        Coordinate<Double> c1 = new Coordinate<>(123.5, 30.0);
        System.out.println(c1);
        
        Coordinate<String> c2 = new Coordinate<>("东经123.5°", "北纬30°");
        System.out.println(c2);
    }
}
class Coordinate<T>{
    private T x;
    private T y;
    public Coordinate(T x, T y) {
        super();
        this.x = x;
        this.y = y;
    }
    public Coordinate() {
        super();
    }
    public T getX() {
        return x;
    }
    public void setX(T x) {
        this.x = x;
    }
    public T getY() {
        return y;
    }
    public void setY(T y) {
        this.y = y;
    }
    @Override
    public String toString() {
        return "Coordinate [x=" + x + ", y=" + y + "]";
    }
    
}

第三题

案例:

1、声明泛型方法,可以实现任意引用类型数组指定位置元素交换。

public static <T> void method( T[] arr,int a,int b)

2、在主方法中调用测试

package com.atguigu.test03;
​
public class Test03 {
    public static void main(String[] args) {
        Integer[] arr = {1,2,3,4,5,6};
        method(arr,0,1);
        for (Integer num : arr) {
            System.out.println(num);
        }
    }
    public static <T> void method( T[] arr,int a,int b){
         //元素互换
        T temp = arr[a];
        arr[a] = arr[b];
        arr[b] = temp;
    }
}
​

第四题

案例:

1、声明泛型方法,可以接收一个任意引用类型的数组,并反转数组中的所有元素

public static <T> void reverse(T[] arr)

2、在主方法中调用测试

package com.atguigu.test04;
​
import java.util.Arrays;
​
public class Test04 {
    public static void main(String[] args) {
        Integer[] arr = {1,2,3,4,5,6};
        reverse(arr);
        System.out.println(Arrays.toString(arr));
    }
    public static <T> void reverse(T[] arr){
        for (int i = 0; i < arr.length/2; i++) {
            T temp = arr[i];
            arr[i] = arr[arr.length-1-i];
            arr[arr.length-1-i] = temp;
        }
    }
}
​

第五题

案例:

1、声明泛型方法,可以给任意对象数组按照元素的自然排序实现从小到大排序,用冒泡排序实现

public static <T> void sort(T[] arr)

2、声明泛型方法,可以给任意对象数组按照指定的比较器实现从小到大排序,用冒泡排序实现

public static <T> void sort(T[] arr, Comparator<? super T> c)

package com.atguigu.test05;
​
import java.util.Arrays;
import java.util.Comparator;
​
public class Test05 {
    public static void main(String[] args) {
        Integer[] arr = {2,4,7,1,3};
        sort(arr);
        System.out.println(Arrays.toString(arr));
        
        String[] all = {"hello","Hello","Chai","chai"};
        sort(all,new Comparator<String>() {
​
            @Override
            public int compare(String o1, String o2) {
                return o1.compareToIgnoreCase(o2);
            }
        });
        System.out.println(Arrays.toString(all));
    }
    public static <T extends Comparable<T>> void sort(T[] arr){
        for (int i = 1; i < arr.length; i++) {
            for (int j = 0; j < arr.length-i; j++) {
                if(arr[j].compareTo(arr[j+1])>0){
                    T temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
    }
    public static <T> void sort(T[] arr, Comparator<? super T> c){
        for (int i = 1; i < arr.length; i++) {
            for (int j = 0; j < arr.length-i; j++) {
                if(c.compare(arr[j], arr[j+1])>0){
                    T temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
    }
}
​

集合练习题

第一题

  • 随机验证码。

    • 随机生成十组六位字符组成的验证码。

    • 验证码由大小写字母、数字字符组成。

  • 代码实现,效果如图所示:

  • 开发提示:

  • 使用字符数组保存原始字符,利用Random类生成随机索引。

  • 将十组验证码放到集合中

  • 用Iterator迭代器遍历集合

package com.atguigu.test01;
​
import java.util.Collection;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Random;
​
public class Test01 {
    @SuppressWarnings("all")
    public static void main(String[] args) {
        char[] arr = new char[26+26+10];
        
        //使用字符数组保存原始字符
        for (int i = 0; i < arr.length; i++) {
            if(i<10){//前10个放数字
                arr[i] = (char)(i+48);
            }else if(i<10+26){//中间26个放大写字母
                arr[i] = (char)(i+65-10);
            }else{//剩下的放小写字母
                arr[i] = (char)(i+97-10-26);
            }
        }
        
        //随机生成10组验证码
        Collection<String> list = new ArrayList<String>();
        Random rand = new Random();
        for (int i = 0; i < 10; i++) {
            String str = "";
            for (int j = 0; j < 6; j++) {
                int index = rand.nextInt(arr.length);
                str += arr[index];
            }
            list.add(str);
        }
        
        Iterator<String> iter = list.iterator();
        while(iter.hasNext()){
            System.out.println("随机验证码:" + iter.next());
        }
    }
}
​

第二题

  • 键盘录入学生信息,保存到集合中。

    • 循环录入的方式,1:表示继续录入,0:表示结束录入。

    • 定义学生类,属性为姓名,年龄,使用学生对象保存录入数据。

    • 使用ArrayList集合,保存学生对象,录入结束后,用foreach遍历集合。

  • 代码实现,效果如图所示:

package com.atguigu.test02;
​
import java.util.Collection;
import java.util.ArrayList;
import java.util.Scanner;
​
public class Test02 {
    public static void main(String[] args) {
        Collection<Student> list = new ArrayList<Student>();
        
        Scanner input = new Scanner(System.in);
        while(true){
            System.out.print("选择(1、录入;0、退出):");
            int select = input.nextInt();
            if(select == 0){
                break;
            }
            System.out.print("姓名:");
            String name = input.next();
            System.out.print("年龄:");
            int age = input.nextInt();
            
            Student stu = new Student(name,age);
            list.add(stu);
        }
        
        for (Student stu : list) {
            System.out.println(stu);
        }
    }
}
class Student{
    private String name;
    private int age;
    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    public Student() {
        super();
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student [name=" + name + ", age=" + age + "]";
    }
    
}

第十七章

第一题

案例:

1、用一个String[]数组存点数

2、用一个String[]数组存花色

3、用一个String[]数组存大王、小王

4、用上面的数组,生成一副扑克牌

5、遍历显示全副扑克牌

6、模拟给4个人随机发牌,每个人11张牌

7、显示每个人的牌和剩余的牌

效果如下:

package com.atguigu.test01;
​
import java.util.ArrayList;
import java.util.Random;
​
public class Test01 {
    public static void main(String[] args) {
        String[] dian = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
        String[] hua = {"黑桃","红桃","方片","梅花"};
        String[] wang = {"大王","小王"};
        
        ArrayList<String> list = new ArrayList<String>();
        for (int i = 0; i < dian.length; i++) {
            for (int j = 0; j < hua.length; j++) {
                list.add(hua[j]+dian[i]);
            }
        }
        for (int i = 0; i < wang.length; i++) {
            list.add(wang[i]);
        }
        
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i)+"  ");
            if((i+1)%10==0){
                System.out.println();
            }
        }
        System.out.println();
        System.out.println("发牌:");
        
        Random rand = new Random();
        ArrayList<String> one = new ArrayList<String>();
        for (int i = 0; i < 11; i++) {
            one.add(list.remove(rand.nextInt(list.size())));
        }
        
        ArrayList<String> two = new ArrayList<String>();
        for (int i = 0; i < 11; i++) {
            two.add(list.remove(rand.nextInt(list.size())));
        }
        
        ArrayList<String> three = new ArrayList<String>();
        for (int i = 0; i < 11; i++) {
            three.add(list.remove(rand.nextInt(list.size())));
        }
        
        ArrayList<String> four = new ArrayList<String>();
        for (int i = 0; i < 11; i++) {
            four.add(list.remove(rand.nextInt(list.size())));
        }
        
        System.out.println("第1个人:" + one);
        System.out.println("第2个人:" + two);
        System.out.println("第3个人:" + three);
        System.out.println("第4个人:" + four);
        System.out.println("剩余:" + list);
    }
}
​

第二题

  • 模拟乐透号码。

    • 随机生成10个号码放到集合中,范围1-50,作为乐透号码。不能重复。

    • 键盘录入10个整数放到集合中,范围1-50,不能重复。

    • 录入的整数与乐透号码对比,统计猜中了几个。

  • 代码实现,效果如图所示:

开发提示:

  • 当使用集合时,可以通过contains方法,判断某集合中是否包含某元素

package com.atguigu.test02;
​
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
​
public class Test02 {
    public static void main(String[] args) {
        ArrayList<Integer> lotNumList = lotNum();
        System.out.println("乐透号码已经生成,游戏开始:");
        ArrayList<Integer> inputList = inputNum();
        System.out.println("您输入的号码为:"+inputList);
        int count  =  countNum(inputList , lotNumList);
        System.out.println("乐透号码为:"+lotNumList);
        System.out.println("猜中了:"+count+"个数字");
    }
​
    public static int countNum(ArrayList<Integer> inputList, ArrayList<Integer> lotNumList) {
        int  count  = 0;
        for (int i = 0; i < inputList.size(); i++) {
            Object num  = inputList.get(i);
            if (lotNumList.contains(num)){
                count++;
            }
        }
        return count ;
    }
    
    public static ArrayList<Integer> inputNum(){
        ArrayList<Integer> list = new ArrayList<Integer>();
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < 10; ) {
            System.out.println("请输入第"+(i+1)+"个数字[1-50]:");
            int num  = sc.nextInt();
​
            if (num >=1 && num<=50 && !list.contains(num)){
                list.add(num);
                i++;
            }else{
                System.out.println(num+"超过[1-50]范围或重复录入,数字无效,请重新输入");
            }
        }
        sc.close();
        return list;
    }
    
    public static ArrayList<Integer> lotNum(){
        ArrayList<Integer> list = new ArrayList<Integer>();
        Random r = new Random();
        for (int i = 0; i < 10; ) {
            int num  = r.nextInt(50) + 1;
​
            if (!list.contains(num)){
                list.add(num);
                i++;
            }
        }
        return list;
    }
}

第三题

案例:

1、随机生成10个[1,100]之间的整数,放到List集合中,遍历显示

2、找出前3名最大值,删除它们,注意可能重复

3、显示删除后的结果

效果如下:

package com.atguigu.test03;
​
import java.util.ArrayList;
import java.util.Random;
​
public class Test03 {
    public static void main(String[] args) {
        ArrayList<Integer> nums = getNum();
        System.out.println("10个随机值:" + nums);
        
        ArrayList<Integer> maxList = getTop3(nums);
        System.out.println("前3个最大的:" + maxList);
        
        System.out.println("删除后:" + nums);
    }
​
    public static ArrayList<Integer> getNum() {
        ArrayList<Integer> list = new ArrayList<Integer>();
        Random r = new Random();
        for (int i = 0; i < 10; i++) {
            int n = r.nextInt(100) + 1;
            list.add(n);
        }
        return list;
    }
    
    public static ArrayList<Integer> getTop3(ArrayList<Integer> list){
        ArrayList<Integer> maxList = new ArrayList<Integer>();
        for (int i = 0; i < 3; i++) {
            Integer max = (Integer) list.get(0);
            for (int j = 0; j < list.size(); j++) {
                Integer num = (Integer) list.get(j);
                if(max < num){
                    max = num;
                }
                
            }
            maxList.add(max);
            
            while(list.contains(max)){
                list.remove(max);
            }
        }
        
        return maxList;
    }
    
}
​

第四题

  • 随机生成30个数,范围2-100,获取其中的质数。

  • 代码实现,效果如图所示:

开发提示:

  • 质数:在一个大于1的整数中,除了1和此整数自身外,没法被其他自然数整除的数。

package com.atguigu.test04;
​
import java.util.ArrayList;
import java.util.Random;
​
public class Test04 {
    public static void main(String[] args) {
        ArrayList<Integer> ranNum = getRanNum();
        System.out.println("随机数为:");
        System.out.println(ranNum);
        System.out.println("其中的质数为:");
        ArrayList<Integer> pNum = getPNum(ranNum);
        System.out.println(pNum);
    }
​
    public static ArrayList<Integer> getPNum(ArrayList<Integer> ranNum) {
        ArrayList<Integer> list = new ArrayList<Integer>();
​
        for (int i = 0; i < ranNum.size(); i++) {
            Integer integer = (Integer) ranNum.get(i);
            if (isP(integer)) {
                list.add(integer);
            }
        }
        return list;
    }
​
    public static ArrayList<Integer> getRanNum() {
        Random random = new Random();
        ArrayList<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i < 30; i++) {
            list.add(random.nextInt(99) + 2);
        }
        return list;
    }
​
    public static boolean isP(int n) {
        boolean isPrime = true;
        for (int i = 2; i < n; i++) {
            if (n % i == 0) {
                isPrime = false;
                break;
            }
        }
        return isPrime;
    }
}
​

第五题

案例:

1、请定义方法public static int listTest(Collection list,String s)统计集合中指定元素出现的次数

2、创建集合,集合存放随机生成的30个小写字母

3、用listTest统计,某些元素的出现次数

效果如下

package com.atguigu.test05;
​
import java.util.ArrayList;
import java.util.Collection;
import java.util.Random;
​
public class Test05 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<String>();
        Random rand = new Random();
        for (int i = 0; i < 30; i++) {
            list.add((char)(rand.nextInt(26)+97)+"");
        }
        System.out.println(list);
        System.out.println("a:"+listTest(list, "a"));   
        System.out.println("b:"+listTest(list, "b"));   
        System.out.println("c:"+listTest(list, "c"));
        System.out.println("x:"+listTest(list, "x"));   
    }
​
    public static int listTest(Collection<String> list, String string) {
        int count = 0;
        for (String object : list) {
            if(string.equals(object)){
                count++;
            }
        }
        return count;
    }
}
​

第六题

案例:键盘录入一个字符串,去掉其中重复字符,打印出不同的那些字符,必须保证顺序。例如输入:aaaabbbcccddd,打印结果为:abcd。效果如图:

提示:LinkedHashSet的使用

package com.atguigu.test06;
​
import java.util.LinkedHashSet;
import java.util.Scanner;
​
public class Test06 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        
        System.out.print("请输入一串字母:");
        String str = input.nextLine();
        System.out.println("str=" + str);
        
        LinkedHashSet<Character> set = new LinkedHashSet<Character>();
        for (int i = 0; i < str.length(); i++) {
            set.add(str.charAt(i));
        }
        
        System.out.print("去重后:");
        String result = "";
        for (Character object : set) {
            result += object;
        }
        System.out.println(result);
    }
}
​

第七题

案例:双色球规则:双色球每注投注号码由6个红色球号码和1个蓝色球号码组成。红色球号码从1—33中选择;蓝色球号码从1—16中选择;请随机生成一注双色球号码。(要求同色号码不重复)

开发提示:可以使用TreeSet和ArrayList结合

package com.atguigu.test07;
​
import java.util.ArrayList;
import java.util.Random;
import java.util.TreeSet;
​
public class Test07 {
    public static void main(String[] args) {
        TreeSet<Integer> red = new TreeSet<Integer>();
        Random rand = new Random();
        while(red.size()<6){
            red.add(rand.nextInt(33)+1);
        }
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.addAll(red);
        list.add(rand.nextInt(16)+1);//蓝色号码
        System.out.println("双色球所有号码:" + list);
        
        System.out.print("红色号码:");
        for (int i = 0; i < list.size()-1; i++) {
            System.out.print(list.get(i)+" ");
        }
        System.out.println("蓝色号码:" + list.get(list.size()-1));
    }
}
​

第八题

案例:有如下四个学生的成绩:

(1)用Comparable接口对下列四位同学的成绩做降序排序,如果成绩一样,那在成绩排序的基础上按照年龄由小到大排序。

(2)用Comparator实现按照姓名排序

效果如下

package com.atguigu.test08;
​
import java.util.Comparator;
import java.util.TreeSet;
​
public class Test08 {
    public static void main(String[] args) {
        System.out.println("按照成绩和年龄排序:");
        TreeSet<Student> set = new TreeSet<Student>();
        set.add(new Student("liusan",20,90.0));
        set.add(new Student("lisi",22,90.0));
        set.add(new Student("wangwu",20,99.0));
        set.add(new Student("sunliu",22,100.0));
        for (Object object : set) {
            System.out.println(object);
        }
        
        System.out.println("按照姓名排序:");
        TreeSet<Student> all = new TreeSet<Student>(new Comparator<Student>() {
​
            @Override
            public int compare(Student o1, Student o2) {
                return o1.getName().compareTo(o2.getName());
            }
        });
        for (Student object : set) {
            all.add(object);
        }
        for (Student object : all) {
            System.out.println(object);
        }
    }
}
class Student implements Comparable<Student>{
    private String name;
    private int age;
    private double score;
    public Student(String name, int age, double score) {
        super();
        this.name = name;
        this.age = age;
        this.score = score;
    }
    public Student() {
        super();
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public double getScore() {
        return score;
    }
    public void setScore(double score) {
        this.score = score;
    }
    @Override
    public String toString() {
        return "Student [name=" + name + ", age=" + age + ", score=" + score + "]";
    }
    @Override
    public int compareTo(Student o) {
        if(this.getScore()>o.getScore()){
            return -1;
        }else if(this.getScore() < o.getScore()){
            return 1;
        }
        return this.getAge() - o.getAge();
    }
    
}

第十八章

第一题

开发提示:可以使用Map,key是字母,value是该字母的次数

效果演示:例如:String str = "Your future depends on your dreams, so go to sleep.";

package com.atguigu.test01;
​
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;
​
public class Test01 {
    public static void main(String[] args) {
        String str = "Your future depends on your dreams, so go to sleep.";
        str = str.replaceAll("[^a-zA-Z]", "");
        HashMap<Character,Integer> map = new HashMap<Character,Integer>();
        char[] arr = str.toCharArray();
        for (int i = 0; i < arr.length; i++) {
            if(map.containsKey(arr[i])){
                Integer count = map.get(arr[i]);
                map.put(arr[i], count+1);
            }else{
                map.put(arr[i], 1);
            }
        }
        
        Set<Entry<Character,Integer>> entrySet = map.entrySet();
        for (Entry<Character,Integer> object : entrySet) {
            System.out.println(object);
        }
    }
}
​

第二题

案例:添加你喜欢的歌手以及你喜欢他唱过的歌曲

例如:

package com.atguigu.test02;
​
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;
​
public class Test02 {
    public static void main(String[] args) {
        HashMap<String,ArrayList<String>> map = new HashMap<>();
        
        ArrayList<String> wangfei = new ArrayList<String>();
        wangfei.add("《红豆》");
        wangfei.add("《传奇》");
        wangfei.add("《容易受伤的女人》");
        map.put("王菲", wangfei);
        
        
        ArrayList<String> zxy = new ArrayList<String>();
        zxy.add("《一路上有你》");
        zxy.add("《吻别》");
        zxy.add("《一千个伤心的理由》");
        map.put("张学友", zxy);
        
        Set<Entry<String, ArrayList<String>>> entrySet = map.entrySet();
        for (Entry<String, ArrayList<String>> object : entrySet) {
            System.out.println(object);
        }
    }
}
​

第三题

案例:

添加如下省份与城市信息到map中,并遍历显示

浙江省
    绍兴市
    温州市
    湖州市
    嘉兴市
    台州市
    金华市
    舟山市
    衢州市
    丽水市
    杭州市
    宁波市
海南省
    海口市
    三亚市
北京市
    北京市

开发提示:

其中key为省份名,value为该省份所有的市辖区

package com.atguigu.test03;
​
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;
​
public class Test03 {
    public static void main(String[] args) throws Exception {
        HashMap<String,List<String>> map = new HashMap<>();
        map.put("北京市", Arrays.asList("北京市"));
        map.put("海南省", Arrays.asList("海口市","三亚市"));
        map.put("浙江省", Arrays.asList("绍兴市","温州市","湖州市","嘉兴市","台州市","金华市","舟山市","衢州市","丽水市"));
    
        Set<Entry<String, List<String>>> entrySet = map.entrySet();
        for (Entry<String, List<String>> object : entrySet) {
            System.out.println(object);
        }
    }
}
​

第四题

案例:模拟斗地主洗牌和发牌并对牌进行排序的代码实现

运行效果如下:

开发提示:

(1)用String[] nums = { "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2" };存储数字

String[] colors = { "方片", "梅花", "红桃", "黑桃" };存储花色

(2)单独处理大王、小王

(3)将54张牌的索引[1,54]数字依次存储到一个ArrayList中

(4)用nums和colors数组的组合,将54张牌存储的一个Map中,key是索引,范围是1-54,value是牌面,例如:(1,黑桃3),...(54,小王)

(5)对ArrayList进行洗牌打乱顺序

(6)依次取list中的索引,发给四位牌友,四位牌友的牌可以用TreeSet存储,这样可以按照索引大小排序,索引大小就是牌的大小

(7)遍历结果,TreeSet中存储的是牌的索引,显示的时候从Map中取出牌显示

package com.atguigu.test04;
​
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.TreeSet;
​
public class Test04 {
​
    public static void main(String[] args) {
        String[] nums = { "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2" };
        String[] colors = { "方片", "梅花", "红桃", "黑桃" };
        
        ArrayList<Integer> list = new ArrayList<Integer>(); // 存储54章牌的索引[0,53]
        HashMap<Integer,String> map = new HashMap<>(); // 存储索引和扑克牌
        int index = 1; // 索引的开始值
        for (String num : nums) {
            for (String color : colors) {
                map.put(index, color.concat(num)); // 将索引和扑克牌添加到HashMap中
                list.add(index); // 将索引添加到ArrayList集合中
                index++;
            }
        }
        map.put(index, "小王");
        list.add(index);
        index++;
        map.put(index, "大王");
        list.add(index);
        // 洗牌
        Collections.shuffle(list);
        // 发牌
        TreeSet<Integer> left = new TreeSet<Integer>();
        TreeSet<Integer> right = new TreeSet<Integer>();
        TreeSet<Integer> me = new TreeSet<Integer>();
        TreeSet<Integer> up = new TreeSet<Integer>();
        TreeSet<Integer> lastCards = new TreeSet<Integer>();
        for (int i = 0; i < 13; i++) {
            right.add(list.remove(0));
            left.add(list.remove(0));
            me.add(list.remove(0));
            up.add(list.remove(0));
        }
        lastCards.addAll(list);
​
        // 看牌
        lookPoker("左边玩家", left, map);
        lookPoker("右边玩家", right, map);
        lookPoker("上边玩家", up, map);
        lookPoker("我", me, map);
        lookPoker("底牌", lastCards, map);
}
​
    public static void lookPoker(String name, TreeSet<Integer> ts, HashMap<Integer, String> map) {
        System.out.println(name + "的牌是:");
        for (Integer index : ts) {
            System.out.print(map.get(index) + " ");
        }
​
        System.out.println();
    }
}
​

第五题

案例:

(1)从键盘输入一个年份,输出该年的世界杯冠军是哪支球队。如果该年没有举办世界杯,则输出:没有举办世界杯。

(2)从键盘输入一支球队的名字,输出该球队夺冠的年份列表。 例如,读入“巴西”,应当输出 1958 1962 1970 1994 2002 读入“荷兰”,应当输出 没有获得过世界杯

运行效果如下:

开发提示:

把年份作为key,改年夺冠的国家名称作为value存到map中

附:历届世界杯冠军

届数举办年份举办地点冠军
第一届1930年乌拉圭乌拉圭
第二届1934年意大利意大利
第三届1938年法国意大利
第四届1950年巴西乌拉圭
第五届1954年瑞士西德
第六届1958年瑞典巴西
第七届1962年智利巴西
第八届1966年英格兰英格兰
第九届1970年墨西哥巴西
第十届1974年前西德西德
第十一届1978年阿根廷阿根廷
第十二届1982年西班牙意大利
第十三届1986年墨西哥阿根廷
第十四届1990年意大利西德
第十五届1994年美国巴西
第十六届1998年法国法国
第十七届2002年韩日巴西
第十八届2006年德国意大利
第十九届2010年南非西班牙
第二十届2014年巴西德国
第二十一届2018年俄罗斯法国
package com.atguigu.test05;
​
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
​
public class Test05 {
    public static void main(String[] args) {
​
        Map<Integer,String> m = new HashMap<>();
​
        m.put(1930, "乌拉圭");
        m.put(1934, "意大利");
        m.put(1938, "意大利");
        m.put(1950, "乌拉圭");
        m.put(1954, "西德");
        m.put(1958, "巴西");
        m.put(1962, "巴西");
        m.put(1966, "英格兰");
        m.put(1970, "巴西");
        m.put(1974, "西德");
        m.put(1978, "阿根廷");
        m.put(1982, "意大利");
        m.put(1986, "阿根廷");
        m.put(1990, "西德");
        m.put(1994, "巴西");
        m.put(1998, "法国");
        m.put(2002, "巴西");
        m.put(2006, "意大利");
        m.put(2010, "西班牙");
        m.put(2014, "德国");
        m.put(2018, "法国");
​
        Scanner input = new Scanner(System.in);
        System.out.print("请输入一个年份:");
        int key = input.nextInt();
​
        if (m.containsKey(key)) {
            System.out.println(key + "年,获得世界杯冠军的是:" + m.get(key));
        } else {
            System.out.println("该年没有举办世界杯!");
        }
​
        System.out.print("请输入一个国家名称:");
        String country = input.next();
​
        if (m.containsValue(country)) {
            System.out.println("该国球队在如下年份获得过冠军:");
            for (Integer year : m.keySet()) {
                if (m.get(year).equals(country)) {
                    System.out.println(year);
                }
            }
        } else {
            System.out.println("该国家没有获得世界杯冠军");
        }
​
    }
}
​

第六题

案例:模拟菜单的二级联动效果

现有全国各省市信息字符串如下:

        String str = "'北京': ['北京'];"
                +"'上海': ['上海'];"
                +"'天津': ['天津'];"
                +"'重庆': ['重庆'];"
                +"'河北省': ['石家庄', '张家口', '承德', '秦皇岛', '唐山', '廊坊', '保定', '沧州', '衡水', '邢台', '邯郸'];"
                +"'山西省': ['太原', '大同', '朔州', '阳泉', '长治', '晋城', '忻州', '吕梁', '晋中', '临汾', '运城'];"
                +"'辽宁省': ['沈阳', '朝阳', '阜新', '铁岭', '抚顺', '本溪', '辽阳', '鞍山', '丹东', '大连', '营口', '盘锦', '锦州', '葫芦岛'];"
                +"'吉林省': ['长春', '白城', '松原', '吉林', '四平', '辽源', '通化', '白山', '延边'];"
                +"'黑龙江省': ['哈尔滨', '齐齐哈尔', '黑河', '大庆', '伊春', '鹤岗', '佳木斯', '双鸭山', '七台河', '鸡西', '牡丹江', '绥化', '大兴安'];"
                +"'江苏省': ['南京', '徐州', '连云港', '宿迁', '淮阴', '盐城', '扬州', '泰州', '南通', '镇江', '常州', '无锡', '苏州'];"
                +"'浙江省': ['杭州', '湖州', '嘉兴', '舟山', '宁波', '绍兴', '金华', '台州', '温州', '丽水','衢州'];"
                +"'安徽省': ['合肥', '宿州', '淮北', '阜阳', '蚌埠', '淮南', '滁州', '马鞍山', '芜湖', '铜陵', '安庆', '黄山', '六安', '巢湖', '池州', '宣城'];"
                +"'福建省': ['福州', '南平', '三明', '莆田', '泉州', '厦门', '漳州', '龙岩', '宁德'];"
                +"'江西省': ['南昌', '九江', '景德镇', '鹰潭', '新余', '萍乡', '赣州', '上饶', '抚州', '宜春', '吉安'];"
                +"'山东省': ['济南', '聊城', '德州', '东营', '淄博', '潍坊', '烟台', '威海', '青岛', '日照', '临沂', '枣庄', '济宁', '泰安', '莱芜', '滨州', '菏泽'];"
                +"'河南省': ['郑州', '三门峡', '洛阳', '焦作', '新乡', '鹤壁', '安阳', '濮阳', '开封', '商丘', '许昌', '漯河', '平顶山', '南阳', '信阳', '周口', '驻马店'];"
                +"'湖北省': ['武汉', '十堰', '襄攀', '荆门', '孝感', '黄冈', '鄂州', '黄石', '咸宁', '荆州', '宜昌', '恩施', '襄樊'];"
                +"'湖南省': ['长沙', '张家界', '常德', '益阳', '岳阳', '株洲', '湘潭', '衡阳', '郴州', '永州', '邵阳', '怀化', '娄底', '湘西'];"
                +"'广东省': ['广州', '清远', '韶关', '河源', '梅州', '潮州', '汕头', '揭阳', '汕尾', '惠州', '东莞', '深圳', '珠海', '江门', '佛山', '肇庆', '云浮', '阳江', '茂名', '湛江'];"
                +"'海南省': ['海口', '三亚'];"
                +"'四川省': ['成都', '广元', '绵阳', '德阳', '南充', '广安', '遂宁', '内江', '乐山', '自贡', '泸州', '宜宾', '攀枝花', '巴中', '达川', '资阳', '眉山', '雅安', '阿坝', '甘孜', '凉山'];"
                +"'贵州省': ['贵阳', '六盘水', '遵义', '毕节', '铜仁', '安顺', '黔东南', '黔南', '黔西南'];"
                +"'云南省': ['昆明', '曲靖', '玉溪', '丽江', '昭通', '思茅', '临沧', '保山', '德宏', '怒江', '迪庆', '大理', '楚雄', '红河', '文山', '西双版纳'];"
                +"'陕西省': ['西安', '延安', '铜川', '渭南', '咸阳', '宝鸡', '汉中', '榆林', '商洛', '安康'];"
                +"'甘肃省': ['兰州', '嘉峪关', '金昌', '白银', '天水', '酒泉', '张掖', '武威', '庆阳', '平凉', '定西', '陇南', '临夏', '甘南'];"
                +"'青海省': ['西宁', '海东', '西宁', '海北', '海南', '黄南', '果洛', '玉树', '海西'];"
                +"'内蒙古': ['呼和浩特', '包头', '乌海', '赤峰', '呼伦贝尔盟', '兴安盟', '哲里木盟', '锡林郭勒盟', '乌兰察布盟', '鄂尔多斯', '巴彦淖尔盟', '阿拉善盟'];"
                +"'广西': ['南宁', '桂林', '柳州', '梧州', '贵港', '玉林', '钦州', '北海', '防城港', '南宁', '百色', '河池', '柳州', '贺州'];"
                +"'西藏': ['拉萨', '那曲', '昌都', '林芝', '山南', '日喀则', '阿里'];"
                +"'宁夏': ['银川', '石嘴山', '吴忠', '固原'];"
                +"'新疆': ['乌鲁木齐', '克拉玛依', '喀什', '阿克苏', '和田', '吐鲁番', '哈密', '博尔塔拉', '昌吉', '巴音郭楞', '伊犁', '塔城', '阿勒泰'];"
                +"'香港': ['香港'];"
                +"'澳门': ['澳门'];"
                +"'台湾': ['台北', '台南', '其他']";

效果如下:

请选择:
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:台湾
省份:11
该省份共有辖区:[杭州, 湖州, 嘉兴, 舟山, 宁波, 绍兴, 金华, 台州, 温州, 丽水, 衢州]

开发提示:

(1)把字符串str字符串先按照;进行拆分,得到34个省(包括23个省,5个自治区,4个直辖市,2个特别行政区,下面的题目描述中,把它们都成为省份)

(2)然后把每个省的字符串,按照:进行拆分,那么:左边的是省份名称,:右边的是该省的各市辖区

(3)把34个省存储到一个HashMap集合中,其中编号是key,省份名是value

(4)把所有省份的城市存储到一个LinkedHashMap集合中,其中省份名是key,该省份的所有城市用一个ArrayList的集合装起来,然后作为value。

(5)注意,字符串处理过程中,注意:[、]、,、'等标点符号的处理

例如:

去掉单引号'
replace("'", "")

去掉[,],',空格
replaceAll("\\[|\\]|\\'| ", "")
package com.atguigu.test06;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;

public class Test06 {
	public static void main(String[] args) {
		LinkedHashMap<String,ArrayList<String>> all = new LinkedHashMap<>();
		HashMap<Integer,String> allProvinces = new HashMap<>();
		String str = "'北京': ['北京'];"
				+"'上海': ['上海'];"
				+"'天津': ['天津'];"
				+"'重庆': ['重庆'];"
				+"'河北省': ['石家庄', '张家口', '承德', '秦皇岛', '唐山', '廊坊', '保定', '沧州', '衡水', '邢台', '邯郸'];"
				+"'山西省': ['太原', '大同', '朔州', '阳泉', '长治', '晋城', '忻州', '吕梁', '晋中', '临汾', '运城'];"
				+"'辽宁省': ['沈阳', '朝阳', '阜新', '铁岭', '抚顺', '本溪', '辽阳', '鞍山', '丹东', '大连', '营口', '盘锦', '锦州', '葫芦岛'];"
				+"'吉林省': ['长春', '白城', '松原', '吉林', '四平', '辽源', '通化', '白山', '延边'];"
				+"'黑龙江省': ['哈尔滨', '齐齐哈尔', '黑河', '大庆', '伊春', '鹤岗', '佳木斯', '双鸭山', '七台河', '鸡西', '牡丹江', '绥化', '大兴安'];"
				+"'江苏省': ['南京', '徐州', '连云港', '宿迁', '淮阴', '盐城', '扬州', '泰州', '南通', '镇江', '常州', '无锡', '苏州'];"
				+"'浙江省': ['杭州', '湖州', '嘉兴', '舟山', '宁波', '绍兴', '金华', '台州', '温州', '丽水','衢州'];"
				+"'安徽省': ['合肥', '宿州', '淮北', '阜阳', '蚌埠', '淮南', '滁州', '马鞍山', '芜湖', '铜陵', '安庆', '黄山', '六安', '巢湖', '池州', '宣城'];"
				+"'福建省': ['福州', '南平', '三明', '莆田', '泉州', '厦门', '漳州', '龙岩', '宁德'];"
				+"'江西省': ['南昌', '九江', '景德镇', '鹰潭', '新余', '萍乡', '赣州', '上饶', '抚州', '宜春', '吉安'];"
				+"'山东省': ['济南', '聊城', '德州', '东营', '淄博', '潍坊', '烟台', '威海', '青岛', '日照', '临沂', '枣庄', '济宁', '泰安', '莱芜', '滨州', '菏泽'];"
				+"'河南省': ['郑州', '三门峡', '洛阳', '焦作', '新乡', '鹤壁', '安阳', '濮阳', '开封', '商丘', '许昌', '漯河', '平顶山', '南阳', '信阳', '周口', '驻马店'];"
				+"'湖北省': ['武汉', '十堰', '襄攀', '荆门', '孝感', '黄冈', '鄂州', '黄石', '咸宁', '荆州', '宜昌', '恩施', '襄樊'];"
				+"'湖南省': ['长沙', '张家界', '常德', '益阳', '岳阳', '株洲', '湘潭', '衡阳', '郴州', '永州', '邵阳', '怀化', '娄底', '湘西'];"
				+"'广东省': ['广州', '清远', '韶关', '河源', '梅州', '潮州', '汕头', '揭阳', '汕尾', '惠州', '东莞', '深圳', '珠海', '江门', '佛山', '肇庆', '云浮', '阳江', '茂名', '湛江'];"
				+"'海南省': ['海口', '三亚'];"
				+"'四川省': ['成都', '广元', '绵阳', '德阳', '南充', '广安', '遂宁', '内江', '乐山', '自贡', '泸州', '宜宾', '攀枝花', '巴中', '达川', '资阳', '眉山', '雅安', '阿坝', '甘孜', '凉山'];"
				+"'贵州省': ['贵阳', '六盘水', '遵义', '毕节', '铜仁', '安顺', '黔东南', '黔南', '黔西南'];"
				+"'云南省': ['昆明', '曲靖', '玉溪', '丽江', '昭通', '思茅', '临沧', '保山', '德宏', '怒江', '迪庆', '大理', '楚雄', '红河', '文山', '西双版纳'];"
				+"'陕西省': ['西安', '延安', '铜川', '渭南', '咸阳', '宝鸡', '汉中', '榆林', '商洛', '安康'];"
				+"'甘肃省': ['兰州', '嘉峪关', '金昌', '白银', '天水', '酒泉', '张掖', '武威', '庆阳', '平凉', '定西', '陇南', '临夏', '甘南'];"
				+"'青海省': ['西宁', '海东', '西宁', '海北', '海南', '黄南', '果洛', '玉树', '海西'];"
				+"'内蒙古': ['呼和浩特', '包头', '乌海', '赤峰', '呼伦贝尔盟', '兴安盟', '哲里木盟', '锡林郭勒盟', '乌兰察布盟', '鄂尔多斯', '巴彦淖尔盟', '阿拉善盟'];"
				+"'广西': ['南宁', '桂林', '柳州', '梧州', '贵港', '玉林', '钦州', '北海', '防城港', '南宁', '百色', '河池', '柳州', '贺州'];"
				+"'西藏': ['拉萨', '那曲', '昌都', '林芝', '山南', '日喀则', '阿里'];"
				+"'宁夏': ['银川', '石嘴山', '吴忠', '固原'];"
				+"'新疆': ['乌鲁木齐', '克拉玛依', '喀什', '阿克苏', '和田', '吐鲁番', '哈密', '博尔塔拉', '昌吉', '巴音郭楞', '伊犁', '塔城', '阿勒泰'];"
				+"'香港': ['香港'];"
				+"'澳门': ['澳门'];"
				+"'台湾': ['台北', '台南', '其他']";
		
		String[] provincesStr = str.split(";");
		for (int i = 0; i < provincesStr.length; i++) {
			String[] split = provincesStr[i].split(":");
			String proviceName = split[0].replace("'", "");
			allProvinces.put(i+1, proviceName);
			
			ArrayList<String> cityList = new ArrayList<String>();
			String[] cityStrings = split[1].replaceAll("\\[|\\]|\\'| ", "").split(",");
			for (int j = 0; j < cityStrings.length; j++) {
				cityList.add(cityStrings[j]);
			}
			all.put(proviceName, cityList);
		}
		
		Scanner input = new Scanner(System.in);
		System.out.println("请选择:");
		Set<Entry<Integer, String>> entrySet = allProvinces.entrySet();
		for (Entry<Integer, String> object : entrySet) {
			System.out.println(object); 
		}
		System.out.print("省份:");
		int select = input.nextInt();
		System.out.println("该省份共有辖区:" + all.get(allProvinces.get(select)));
	}
}

第十九章

文件操作

第一题

案例:

1、使用绝对路径,在D盘下创建一个testIO文件夹,然后在testIO文件夹中创建一个1.txt文件

2、使用相对路径,在当前项目下创建一个testIO文件夹,然后在testIO文件夹中创建一个1.txt文件

package com.atguigu.test01;
​
import java.io.File;
import java.io.IOException;
​
import org.junit.Test;
​
public class Test01 {
    @Test
    public void test01() throws IOException {
        File dir = new File("d:/testIO");
        dir.mkdir();
        
        File file = new File("d:/testIO/1.txt");
        file.createNewFile();
    }
    
    @Test
    public void test02() throws IOException {
        File dir = new File("testIO");
        dir.mkdir();
        
        File file = new File("testIO/1.txt");
        file.createNewFile();
    }
}

第二题

案例:

1、检查D盘的testIO文件夹下是否存在文件a.txt,如果不存在则创建该文件。

2、获取D盘的testIO文件夹下的a.txt文件的文件名,文件大小,文件的绝对路径和父路径等信息,并将信息输出在控制台

3、判断File file = new File("d:\testIO");是否文件,是文件则输出:xxx是一个文件,是否文件夹,是文件夹则输出:xxx是一个文件夹

4、删除D盘的testIO文件夹下的a.txt文件

5、删除当前项目下的testIO文件夹下的1.txt文件,然后删除testIO文件夹

package com.atguigu.test02;
​
import java.io.File;
import java.io.IOException;
​
import org.junit.Test;
​
public class Test02 {
    @Test
    public void test05(){
        File file = new File("d:/testIO/1.txt");
        file.delete();
        
        File dir = new File("d:/testIO");
        dir.delete();
    }
    
    @Test
    public void test04(){
        File file = new File("d:/testIO/a.txt");
        file.delete();
    }
    @Test
    public void test03(){
        File file = new File("d:/testIO");
        if(file.isFile()){
            System.out.println(file+"是一个文件。");
        }else if(file.isDirectory()){
            System.out.println(file + "是一个文件夹");
        }
    }
    @Test
    public void test02(){
        File file = new File("d:/testIO/a.txt");
        System.out.println("文件名:" + file.getName());
        System.out.println("文件大小:" + file.length());
        System.out.println("文件的绝对路径:" + file.getAbsolutePath());
        System.out.println("文件的父目录:" + file.getParent());
    }
    @Test
    public void test01(){
        File file = new File("d:/testIO/a.txt");
        try {
            if(!file.exists()){
                file.createNewFile();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }       
    }
}

IO流操作

第三题

案例:

1、把老师的word笔记文档《第14章 IO流.docx》,复制到当前项目的testIO文件夹下。

2、要求使用缓冲流和文件流一起实现

package com.atguigu.test03;
​
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
​
public class Test03 {
    public static void main(String[] args) {
        try(
                BufferedInputStream bis = new BufferedInputStream(
                        new FileInputStream("D:/尚硅谷_190513班_柴林燕_JavaSE/笔记/第14章 IO流.docx"));
                BufferedOutputStream bos = new BufferedOutputStream(
                        new FileOutputStream("testIO/第14章 IO流.docx"));
        ){
            byte[] data = new byte[1024];
            int len;
            while((len = bis.read(data))!=-1){
                bos.write(data, 0, len);
            }
        }catch(IOException e){
            e.printStackTrace();
        }
    }
}

第四题

案例:

把今天的作业文件夹day22_homework下的《我想对你说.txt》字符编码为GBK,复制到当前项目的testIO文件夹下的《柴老师的话.txt》字符编码为UTF-8

package com.atguigu.test04;
​
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
​
public class Test04 {
    public static void main(String[] args) {
        try(
            FileInputStream fis = new FileInputStream("d:/atguigu/day22_homework/我想对你说.txt");
            BufferedInputStream bis = new BufferedInputStream(fis);
            InputStreamReader isr = new InputStreamReader(bis,"GBK");
                
            FileOutputStream fos = new FileOutputStream("testIO/柴老师的话.txt");
            BufferedOutputStream bos = new BufferedOutputStream(fos);
            OutputStreamWriter osw = new OutputStreamWriter(bos, "UTF-8");  
        ){
            char[] data = new char[1024];
            int len;
            while((len = isr.read(data))!=-1){
                osw.write(data, 0, len);
            }
        }catch(IOException e){
            e.printStackTrace();
        }
    }
}
​

第五题

案例:

把如下这些数据存放到一个data.dat文件中,并且再次读取显示

int a = 10;
char c = 'a';
double d = 2.5;
boolean b = true;
String str = "尚硅谷";
package com.atguigu.test05;
​
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
​
import org.junit.Test;
​
public class Test05 {
    @Test
    public void test02() throws IOException {
        DataInputStream dis = new DataInputStream(new FileInputStream("data.dat"));
        System.out.println(dis.readInt());
        System.out.println(dis.readChar());
        System.out.println(dis.readDouble());
        System.out.println(dis.readBoolean());
        System.out.println(dis.readUTF());
        dis.close();
    }
    
    @Test
    public void test01() throws IOException {
        int a = 10;
        char c = 'a';
        double d = 2.5;
        boolean b = true;
        String str = "尚硅谷";
        
        DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.dat"));
        dos.writeInt(a);
        dos.writeChar(c);
        dos.writeDouble(d);
        dos.writeBoolean(b);
        dos.writeUTF(str);
        dos.close();
    }
}

第六题

案例:

1、声明一个Message类,包含:发送者、接收者、消息内容、发送时间

2、创建一个Message对象,并写到message.dat文件中,并再次读取显示

package com.atguigu.test06;
​
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
​
import org.junit.Test;
​
public class Test06 {
    @Test
    public void test02() throws FileNotFoundException, IOException, ClassNotFoundException{
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("message.dat"));
        Object msg = ois.readObject();
        System.out.println(msg);
        ois.close();
    }
    @Test
    public void test01() throws FileNotFoundException, IOException{
        Message msg = new Message("柴老师", "佟老师", "加工资", System.currentTimeMillis());
        
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("message.dat"));
        oos.writeObject(msg);
        oos.close();
    }
}
class Message implements Serializable{
​
    private static final long serialVersionUID = 1L;
    private String fromUser;
    private String toUser;
    private String content;
    private long sendTime;
    public Message(String fromUser, String toUser, String content, long sendTime) {
        super();
        this.fromUser = fromUser;
        this.toUser = toUser;
        this.content = content;
        this.sendTime = sendTime;
    }
    public Message() {
        super();
    }
    public String getFromUser() {
        return fromUser;
    }
    public void setFromUser(String fromUser) {
        this.fromUser = fromUser;
    }
    public String getToUser() {
        return toUser;
    }
    public void setToUser(String toUser) {
        this.toUser = toUser;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    public long getSendTime() {
        return sendTime;
    }
    public void setSendTime(long sendTime) {
        this.sendTime = sendTime;
    }
    @Override
    public String toString() {
        return "Message [fromUser=" + fromUser + ", toUser=" + toUser + ", content=" + content + ", sendTime="
                + sendTime + "]";
    }
}

第七题

案例:

1、使用从键盘输入三句话,用PrintStream打印到一个words.txt文件中

2、再用Scanner一行一行读取显示

package com.atguigu.test07;
​
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.util.Scanner;
​
import org.junit.Test;
​
public class Test07 {
    @Test
    public void test02() throws FileNotFoundException{
        Scanner input = new Scanner(new File("words.txt"));
        while(input.hasNextLine()){
            System.out.println(input.nextLine());
        }
        input.close();
    }
    
    
    @Test
    public void test01() throws FileNotFoundException{
        Scanner input = new Scanner(System.in);
        PrintStream ps = new PrintStream("words.txt");
        for (int i = 0; i < 3; i++) {
            System.out.println("请输入第" + (i+1) + "句要对柴老师说的话:");
            String content = input.nextLine();
            ps.println(content);
        }
        input.close();
        ps.close();
    }
}
​

递归

第八题

案例:获取D盘atguigu文件夹下所有的.java文件

(1)不包含子文件夹

(2)包含子文件夹

package com.atguigu.test08;

import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;

import org.junit.Test;

public class Test08 {
	@Test
	public void test01(){
		File  file = new File("D:/atguigu");
		//不包含子文件夹中的
		File[] listFiles = file.listFiles(new FileFilter() {
			
			@Override
			public boolean accept(File pathname) {
				
				return pathname.getName().endsWith(".java");
			}
		});
		for (File sub : listFiles) {
			System.out.println(sub);
		}
	}
	
	@Test
	public void test02() {
		File  file = new File("D:/atguigu");
		//包含子文件夹中的
		ArrayList<String> all = listAllSubs(file);
		for (String string : all) {
			System.out.println(string);
		}
	}
	
	public ArrayList<String> listAllSubs(File file){
		ArrayList<String> list = new ArrayList<>();
		if(file.isFile()){
			if(file.getName().endsWith(".java")){
				list.add(file.getPath());
			}
		}else if(file.isDirectory()){
			File[] listFiles = file.listFiles();
			for (File sub : listFiles) {
				list.addAll(listAllSubs(sub));
			}
		}
		return list;
	}
}

第九题

案例:统计《尚硅谷190513班柴林燕_JavaSE》文件夹大小

package com.atguigu.test09;

import java.io.File;

import org.junit.Test;

public class Test09 {
	@Test
	public void test01(){
		File file = new File("d:/尚硅谷_190513班_柴林燕_JavaSE");
		long size = size(file);
		System.out.println("文件夹总大小:" + size);
	}
	public long size(File file){
		if(file.isFile()){
			return file.length();
		}else if(file.isDirectory()){
			File[] listFiles = file.listFiles();
			long sum = 0;
			for (File sub : listFiles) {
				sum += size(sub);
			}
			return sum;
		}
		return 0;
	}
}

第十题

案例:复制《尚硅谷190513班柴林燕_JavaSE》到当前项目的testIO文件夹中

package com.atguigu.test10;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import org.junit.Test;

public class Test10 {
	@Test
	public void test01() throws IOException{
		File src = new File("d:/作业与成绩");
		File dest = new File("testIO");
		copyDir(src, dest);
	}
	
	public void copyDir(File src, File dest) throws IOException{
		if(dest.isFile()){
			throw new RuntimeException(dest +"不是文件夹");
		}
		if(src.isFile()){
			File destFile = new File(dest.getPath()+"/" + src.getName());
			copyFile(src, destFile);
		}else if(src.isDirectory()){
			File destFile = new File(dest.getPath()+"/" + src.getName());
			destFile.mkdir();
			
			File[] listFiles = src.listFiles();
			for (File sub : listFiles) {
				copyDir(sub,destFile);
			}
		}
	}
	
	public void copyFile(File srcFile, File destFile) throws IOException{
		FileInputStream fis = new FileInputStream(srcFile);
		FileOutputStream fos = new FileOutputStream(destFile);
		byte[] data = new byte[1024];
		int len;
		while((len = fis.read(data)) !=-1){
			fos.write(data, 0, len);
		}
		fis.close();
		fos.close();
	}
}

第十一题

案例:删除当前项目的testIO文件夹

package com.atguigu.test11;

import java.io.File;

import org.junit.Test;

public class Test11 {
	@Test
	public void test01(){
		deleteDir(new File("testIO"));
	}
	
	public void deleteDir(File dir){
		if(dir.isDirectory()){
			File[] listFiles = dir.listFiles();
			for (File sub : listFiles) {
				deleteDir(sub);
			}
		}
		
		dir.delete();
	}
}

第十二题

案例:剪切《尚硅谷190513班柴林燕_JavaSE》到当前项目的testIO文件夹中

package com.atguigu.test12;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import org.junit.Test;

public class Test12 {
	@Test
	public void test01() throws IOException{
		File src = new File("testIO");
		File dest = new File("testIO2");
		cutDir(src, dest);
	}
	
	public void cutDir(File src, File dest) throws IOException{
		if(dest.isFile()){
			throw new RuntimeException(dest +"不是文件夹");
		}
		if(src.isFile()){
			File destFile = new File(dest.getPath()+"/" + src.getName());
			copyFile(src, destFile);
		}else if(src.isDirectory()){
			File destFile = new File(dest.getPath()+"/" + src.getName());
			destFile.mkdir();
			
			File[] listFiles = src.listFiles();
			for (File sub : listFiles) {
				cutDir(sub,destFile);
			}
		}
		src.delete();
	}
	
	public void copyFile(File srcFile, File destFile) throws IOException{
		FileInputStream fis = new FileInputStream(srcFile);
		FileOutputStream fos = new FileOutputStream(destFile);
		byte[] data = new byte[1024];
		int len;
		while((len = fis.read(data)) !=-1){
			fos.write(data, 0, len);
		}
		fis.close();
		fos.close();
	}
}

第二十章

第一题

案例:客户端模拟学生咨询,服务器端模拟咨询老师,进行交互。

客户端收到信息:

欢迎咨询尚硅谷

报满了,请报下一期吧

服务器端收到信息:

你好,我想报名就业班

好吧,再见!

开发提示:

(1)如果是一个客户端与服务器端交互,怎么实现

(2)如果是多个客户端与服务器交互,怎么实现

package com.atguigu.test01;
​
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
​
public class Test01Client {
    public static void main(String[] args)  throws IOException {
        Socket socket = new Socket("127.0.0.1", 8888); // 创建Socket指定ip地址和端口号
        // 获取输入流
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        System.out.println(br.readLine());
​
        // 获取输出流
        PrintStream ps = new PrintStream(socket.getOutputStream());
        ps.println("你好,我想报名就业班");
​
        System.out.println(br.readLine());
​
        ps.println("好吧,再见!");
        
        socket.close();
    }
}
​
package com.atguigu.test01;
​
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.time.LocalDateTime;
​
public class Test01Server1 {
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(8888);
        Socket socket = server.accept();
        
        // 获取输出流
        PrintStream ps = new PrintStream(socket.getOutputStream());
        ps.println("欢迎咨询尚硅谷");
​
        // 获取输入流
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        System.out.println(socket.getInetAddress().getHostAddress() + "留言:" + LocalDateTime.now());
        System.out.println(br.readLine() + "\n");
​
        ps.println("报满了,请报下一期吧");
​
        System.out.println(socket.getInetAddress().getHostAddress() + "留言:" + LocalDateTime.now());
        System.out.println(br.readLine());
        
        socket.close();
        server.close();
    }
}
package com.atguigu.test01;
​
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.time.LocalDateTime;
​
public class Test01Server2 {
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(8888);
        boolean flag = true;
        while(flag){
            Socket socket = server.accept();
            new Thread(){
                public void run(){
                    try {
                        // 获取输出流
                        PrintStream ps = new PrintStream(socket.getOutputStream());
                        ps.println("欢迎咨询尚硅谷");
    
                        // 获取输入流
                        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                        System.out.println(socket.getInetAddress().getHostAddress() + "留言:" + LocalDateTime.now());
                        System.out.println(br.readLine() + "\n");
    
                        ps.println("报满了,请报下一期吧");
    
                        System.out.println(socket.getInetAddress().getHostAddress() + "留言:" + LocalDateTime.now());
                        System.out.println(br.readLine());
                        
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }.start();
        }
        server.close();
    }
}

第二题

案例:模拟客户端输入要查询的中文,服务器返回对应的英文单词

效果如下:

开发提示:

(1)服务器端有一个map,key是中文词语,value是对应的单词

(2)服务器接收到客户端的词语后,从map中get,如果可以找到,就返回单词,如果找不到,就返回“没有找到”

package com.atguigu.test02;
​
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
​
public class Test02Server {
    public static void main(String[] args) throws IOException {
        HashMap<String, String> dictionary = new HashMap<String, String>();
        dictionary.put("星期一", "Monday");
        dictionary.put("星期二", "Tuesday");
        dictionary.put("星期三", "Wednesday");
        dictionary.put("星期四", "Thursday");
        dictionary.put("星期五", "Friday");
        dictionary.put("星期六", "Saturday");
        dictionary.put("星期七", "Sunday");
        //...
        
        ServerSocket server = new ServerSocket(8888);
        Socket socket = server.accept();
        
        // 获取输入流
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        // 获取输出流
        PrintStream ps = new PrintStream(socket.getOutputStream());
        
        //接收客户端的中文
        String key = br.readLine();
        //查询对应的英文单词,并返回结果
        String words = dictionary.get(key);
        if(words != null){
            ps.println(words);
        }else{
            ps.println("o(╥﹏╥)o没有找到对应的单词!");
        }
        
        socket.close();
        server.close();
    }
}
​
package com.atguigu.test02;
​
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
​
public class Test02Client {
    public static void main(String[] args)  throws IOException {
        // 创建Socket指定ip地址和端口号
        Socket socket = new Socket("127.0.0.1", 8888);
        
        Scanner input = new Scanner(System.in);
        System.out.print("请输入要查询的词语:");
        String content = input.next();
        
        // 获取输出流
        PrintStream ps = new PrintStream(socket.getOutputStream());
        ps.println(content);
        
        // 获取输入流
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        System.out.println("查询结果:" + br.readLine());
        
        socket.close();
        input.close();
    }
}

第三题

案例:客户端给服务器端上传照片

要求:(1)客户端上传的照片,需要是jpg格式的,并且大小在2M(含)以内的,否则不能上传

(2)要求上传成功后,服务器要返回上传成功,如果上传失败,服务器返回上传失败

(3)客户端上传到服务器端的照片,存储在项目名下"photo"的文件夹中,并且以“照片原文件名+时间戳.jpg”命名

效果如下:

package com.atguigu.test03;
​
import java.io.DataInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
​
public class Test03Server{
    public static void main(String[] args) throws IOException {
        //开启服务器
        ServerSocket server = new ServerSocket(8888);
        //接收一个客户端的连接
        Socket socket = server.accept();
        //获取输入流
        DataInputStream dis = new DataInputStream(socket.getInputStream());
        //获取输出流
        PrintStream ps = new PrintStream(socket.getOutputStream());
        //(1)先读取文件名
        String filename = dis.readUTF();
        
        //(2)生成唯一的文件名
        String destfile = "photo" + "/" +  filename + System.currentTimeMillis() + ".jpg";
        
        //(3)读取文件内容,并写入目标文件
        FileOutputStream fos = new FileOutputStream(destfile);
        try {
            byte[] data = new byte[1024];
            int len;
            while((len = dis.read(data)) != -1){
                fos.write(data, 0, len);
            }
            //返回结果给客户端
            ps.println("接收成功!");
        } catch (Exception e) {
            //返回结果给客户端
            ps.println("接收失败!");
        }finally{
            fos.close();
        }
        server.close();
    }
}
​
package com.atguigu.test03;
​
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.util.Scanner;
​
public class Test03Client {
    public static void main(String[] args)throws IOException {
        //连接服务器
        Socket socket= new Socket("127.0.0.1",8888);
        
        //选择要上传的文件
        Scanner input = new Scanner(System.in);
        System.out.println("请选择要上传的文件:");
        //例如:D:\尚硅谷_0325班_柴林燕_JavaSE\笔记\第14章 IO流.docx
        String fileStr  = input.nextLine();
        File file = new File(fileStr);
        
        if(!fileStr.endsWith(".jpg")){
            System.out.println("照片必须是.jpg格式");
            input.close();
            socket.close();
            return;
        }
        if(file.length()>1024*1024*2){
            System.out.println("照片必须在2M(含)以内");
            input.close();
            socket.close();
            return;
        }
        
        DataOutputStream dos = null;
        //从file读取内容,给服务器发送
        FileInputStream fis = null;
        try {
            //获取输出流
            dos = new DataOutputStream(socket.getOutputStream());
            //先发送文件名
            dos.writeUTF(file.getName().substring(0, file.getName().lastIndexOf(".")));
            //发送文件内容
            fis = new FileInputStream(file);
            byte[] data = new byte[1024];
            int len;
            while((len = fis.read(data)) !=-1){
                dos.write(data, 0, len);
            }
            socket.shutdownOutput();//告诉服务器,我发送完毕
        } catch (Exception e) {
            System.out.println("上传失败");
        }finally{
            fis.close();
            dos.close();
        }
        
        //接收结果
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String result = br.readLine();
        System.out.println(result);
        
        br.close();
        socket.close();
        input.close();
    }
​
}
​

第四题

案例:模拟给全部同学群发“欢迎来到尚硅谷”

开发提示:使用UDP群发

package com.atguigu.test04;
​
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
​
public class Test04Send {
    public static void main(String[] args)throws Exception {
        //(1)先建立一个DatagramSocket
        DatagramSocket ds = new DatagramSocket();
        
        //(2)准备发送的数据
        String str = "欢迎来到尚硅谷";
        byte[] data = str.getBytes();
        
        for (int i = 0; i <= 255; i++) {
            //(3)把数据包装成一个数据报
            //DatagramPacket(byte[] buf, int length, InetAddress address, int port)
            /*
             * 第一个参数:要发送的数据的字节数组
             * 第二个参数:数组的长度
             * 第三个参数:接收方的IP地址
             * 第三个参数:接收方的端口号
             * 
             * 好比发快递,需要填写接收方的IP和端口号
             */
            InetAddress ip = InetAddress.getByName("192.168.11."+i);
            int port = 8888;
            DatagramPacket dp = new DatagramPacket(data,data.length,ip,port);
            
            try {
                //(4)发送数据报
                //通过socket发送
                ds.send(dp);
            } catch (Exception e) {
            }
        }
        
        
        //(5)断开
        ds.close();
    }
}
​
package com.atguigu.test04;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class Test04Receiver {
	public static void main(String[] args)throws Exception {
		//1、准备一个socket,用来接收消息
		//接收方,先确定端口号,监听数据的端口号
		//好比,要收到快递,需要先确定自己的地址和手机号,然后对方才能给你发
		DatagramSocket ds = new DatagramSocket(8888);
		
		//2、准备一个数据报,来接收数据
		//DatagramPacket(byte[] buf, int length)
		byte[] data = new byte[1024*64];//64K
		DatagramPacket dp = new DatagramPacket(data,data.length);
		
		//3、接收数据
		ds.receive(dp);
		
		//4、拆包裹
		byte[] result = dp.getData();
		int len = dp.getLength();//实际接收的数据的长度
		System.out.println(new String(result,0,len));
		
		//5、关闭
		ds.close();
	}
}

第二十一章

第一题

案例:用反射获取某个类的信息,并用反射使用某个类

开发提示:

1、声明一个类:com.atguigu.test01.demo.AtguiguDemo,

(1)包含静态变量:学校school(显式初始化为"尚硅谷")

(2)包含属性:班级名称className

(3)并提供构造器,get/set等

(4)实现Serializable和Comparable接口(按照班级名称排序)

2、把com.atguigu.test01.demo.AtguiguDemoclass导出为一个atguigu.jar并放到D:\ProgramFiles\Java\jdk1.8.0_141\jre\lib\ext目录(注意,以你自己的JDK安装目录为准)

3、在测试类Test01的test01()测试方法中,用反射获取AtguiguDemo类的Class对象,并获取它的所有信息,包括类加载器、包名、类名、父类、父接口、属性、构造器、方法们等。

4、在测试类Test01的test02()测试方法中,用反射获取school的值,并修改school的值为“尚硅谷大学”,然后再获取school的值

5、在测试类Test01的test03()测试方法中,用反射创建AtguiguDemo类的对象,并设置班级名称className属性的值,并获取它的值

6、在测试类Test01的test04()测试方法中,用反射获取有参构造创建2个AtguiguDemo类的对象,并获取compareTo方法,调用compareTo方法,比较大小。

package com.atguigu.test01;
​
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType;
import java.util.Arrays;
​
import org.junit.Test;
​
public class Test01 {
    @Test
    public void test01() throws ClassNotFoundException{
        Class clazz = Class.forName("com.atguigu.test01.demo.AtguiguDemo");
        
        ClassLoader classLoader = clazz.getClassLoader();
        System.out.println("类加载器:" + classLoader);
        
        Package pkg = clazz.getPackage();
        System.out.println("包名:" + pkg.getName());
        
        int cMod = clazz.getModifiers();
        System.out.println("类的修饰符:" + Modifier.toString(cMod));
        
        System.out.println("类名:" + clazz.getName());
        System.out.println("父类:" + clazz.getSuperclass().getName());
        Class[] interfaces = clazz.getInterfaces();
        System.out.println("父接口们:"+Arrays.toString(interfaces));
        
        Field[] declaredFields = clazz.getDeclaredFields();
        for (int i =0 ;i<declaredFields.length; i++) {
            System.out.println("第" + (i+1) + "个字段:");
            int fMod = declaredFields[i].getModifiers();
            System.out.println("修饰符:" + Modifier.toString(fMod));
            System.out.println("数据类型:"  + declaredFields[i].getType().getName());
            System.out.println("属性名:" + declaredFields[i].getName());
        }
        
        Constructor[] declaredConstructors = clazz.getDeclaredConstructors();
        for (int i = 0; i < declaredConstructors.length; i++) {
            System.out.println("第" + (i+1) + "个构造器:");
            int csMod = declaredConstructors[i].getModifiers();
            System.out.println("修饰符:" + Modifier.toString(csMod));
            System.out.println("构造器名:" + declaredConstructors[i].getName());
            System.out.println("形参列表:" + Arrays.toString(declaredConstructors[i].getParameterTypes()));
        }
        
        Method[] declaredMethods = clazz.getDeclaredMethods();
        for (int i = 0; i < declaredMethods.length; i++) {
            System.out.println("第" + (i+1) + "个成员方法:");
            int csMod = declaredMethods[i].getModifiers();
            System.out.println("修饰符:" + Modifier.toString(csMod));
            System.out.println("返回值类型:" + declaredMethods[i].getReturnType().getName());
            System.out.println("方法名:" + declaredMethods[i].getName());
            System.out.println("形参列表:" + Arrays.toString(declaredMethods[i].getParameterTypes()));
        }
    }
    
    @Test
    public void test02() throws Exception{
        Class clazz = Class.forName("com.atguigu.test01.demo.AtguiguDemo");
        Field field = clazz.getDeclaredField("school");
        field.setAccessible(true);
        Object value = field.get(null);
        System.out.println("school = " + value);
        
        field.set(null, "尚硅谷大学");
        value = field.get(null);
        System.out.println("school = " + value);
    }
    
    @Test
    public void test03() throws Exception{
        Class clazz = Class.forName("com.atguigu.test01.demo.AtguiguDemo");
        Object object = clazz.newInstance();
        Field field = clazz.getDeclaredField("className");
        field.setAccessible(true);
        Object value = field.get(object);
        System.out.println("className = " + value);
        
        field.set(object, "190513班");
        value = field.get(object);
        System.out.println("className = " + value);
    }
    
    @Test
    public void test04() throws Exception{
        Class clazz = Class.forName("com.atguigu.test01.demo.AtguiguDemo");
        Constructor c = clazz.getDeclaredConstructor(String.class);
        Object obj1 = c.newInstance("190513BJ班");
        Object obj2 = c.newInstance("190325SH班");
        
        Method m = clazz.getDeclaredMethod("compareTo", Object.class);
        System.out.println("obj1与obj2比较结果:" + m.invoke(obj1, obj2));
    }
}
​
package com.atguigu.test01.demo;
​
import java.io.Serializable;
​
public class AtguiguDemo implements Serializable,Comparable<AtguiguDemo>{
    private static final long serialVersionUID = 1L;
    private static String school = "尚硅谷";
    private String className;
    public AtguiguDemo(String className) {
        super();
        this.className = className;
    }
    public AtguiguDemo() {
        super();
    }
    public static String getSchool() {
        return school;
    }
    public static void setSchool(String school) {
        AtguiguDemo.school = school;
    }
    public String getClassName() {
        return className;
    }
    public void setClassName(String className) {
        this.className = className;
    }
    @Override
    public String toString() {
        return "AtguiguDemo [className=" + className + "]";
    }
    @Override
    public int compareTo(AtguiguDemo o) {
        return this.className.compareTo(o.getClassName());
    }
}
​

第二题

案例:榨汁机(Juicer)榨汁的案例,分别有水果(Fruit)苹果(Apple)香蕉(Banana)桔子(Orange)榨汁(squeeze)

效果:

开发提示:

1、声明(Fruit)水果接口,包含榨汁抽象方法:void squeeze();

2、声明榨汁机(Juicer),包含运行方法:public void run(Fruit f),方法体中,调用f的榨汁方法squeeze()

3、声明各种水果类,实现(Fruit)水果接口,并重写squeeze();

4、在src下,建立配置文件:config.properties,并在配置文件中配上fruitName=xxx(其中xx为某种水果的全类名)

5、在Test02测试类中,

(1)读取配置文件,获取水果类名,并用反射创建水果对象,

(2)创建榨汁机对象,并调用run()方法

package com.atguigu.test02;
​
import java.util.Properties;
​
public class Test02 {
    public static void main(String[] args) throws Exception {
        Properties pro = new Properties();
        pro.load(Test02.class.getClassLoader().getResourceAsStream("config.properties"));
        Class<?> clazz = Class.forName(pro.getProperty("fruitName"));
        Fruit f = (Fruit) clazz.newInstance(); 
        Juicer j = new Juicer();
        j.run(f);
    }
​
}
​
interface Fruit {
    public void squeeze();
}
​
class Juicer {
    public void run(Fruit f) {
        f.squeeze();
    }
​
}
class Apple implements Fruit {
    public void squeeze() {
        System.out.println("榨出一杯苹果汁儿");
    }
}
​
class Orange implements Fruit {
    public void squeeze() {
        System.out.println("榨出一杯桔子汁儿");
    }
}
​
​

第三题

代码填空题

package com.atguigu.test03;
​
import java.lang.reflect.ParameterizedType;
​
public class Test03 {
    public static void main(String[] args) {
        SubA a = new SubA();
        System.out.println(a.getType());
        
        SubB b = new SubB();
        System.out.println(b.getType());
    }
}
abstract class Base<T>{
    private Class type;
    
    public Base(){
        //为type属性赋值为T的实际类型
        
        _____________________________________
    }
​
    public Class getType() {
        return type;
    }
}
class SubA extends Base<String>{
​
}
class SubB extends Base{
​
}
package com.atguigu.test03;
​
import java.lang.reflect.ParameterizedType;
​
public class Test03 {
    public static void main(String[] args) {
        SubA a = new SubA();
        System.out.println(a.getType());
        
        SubB b = new SubB();
        System.out.println(b.getType());
    }
}
abstract class Base<T>{
    private Class type;
    
    public Base(){
        Class<? extends Base> clazz = this.getClass();
        try {
            ParameterizedType pt = (ParameterizedType) clazz.getGenericSuperclass();
            type = (Class) pt.getActualTypeArguments()[0];
        } catch (Exception e) {
            type = Object.class;
        }
    }
​
    public Class getType() {
        return type;
    }
}
class SubA extends Base<String>{
​
}
class SubB extends Base{
​
}

第四题

案例:

1、声明自定义注解@Table

(1)加上String类型的配置参数value

(2)并限定@Table的使用位置为类上

(3)并指定生命周期为“运行时”

2、声明自定义注解@Column

(1)加上String类型的配置参数name,表示表格的列名

(2)加上String类型的配置参数type,表示表格的列数据类型

(3)并限定@Column的使用位置在属性上

(4)并指定生命周期为“运行时”

3、声明User类,

(1)属性:id, username, password, email

(2)在User类上,标记@Table注解,并为value赋值为"t_user"

(3)在User类的每一个属性上标记@Column,并为name和type赋值,例如:

id:name赋值为no,type赋值为int

username:name赋值为username,type赋值为varchar(20)

password:name赋值为pwd,type赋值为char(6)

email:name赋值为email,type赋值为varchar(50)

4、在测试类Test04中,通过反射,获取User类以及每一个属性声明的注解,并获取注解值

运行效果:

package com.atguigu.test04;
​
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
​
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
    String value();
}
​
package com.atguigu.test04;
​
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
​
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
    String name();
    String type();
}
package com.atguigu.test04;
​
@Table("t_user")
public class User {
    @Column(name="no",type="int")
    private int id;
    
    @Column(name="username",type="varchar(20)")
    private String username;
    
    @Column(name="pwd",type="char(6)")
    private String password;
    
    @Column(name="email",type="varchar(50)")
    private String email;
    
    public User(int id, String username, String password, String email) {
        super();
        this.id = id;
        this.username = username;
        this.password = password;
        this.email = email;
    }
    public User() {
        super();
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", username=" + username + ", password=" + password + ", email=" + email + "]";
    }
    
}
package com.atguigu.test04;

import java.lang.reflect.Field;

public class Test04 {
	public static void main(String[] args) throws Exception {
		Class clazz = User.class;
		
		Table t = (Table) clazz.getAnnotation(Table.class);
		String table = t.value();
		System.out.println("User类对应数据库表:" + table);
		
		Field idField = clazz.getDeclaredField("id");
		Column idColumn = idField.getAnnotation(Column.class);
		String idName = idColumn.name();
		String idType = idColumn.type();
		System.out.println("id属性对应数据库表的字段:" + idName + ",类型:" + idType);
		
		Field usernameField = clazz.getDeclaredField("username");
		Column usernameColumn = usernameField.getAnnotation(Column.class);
		String usernameName = usernameColumn.name();
		String usernameType = usernameColumn.type();
		System.out.println("username属性对应数据库表的字段:" + usernameName + ",类型:" + usernameType);
		
		Field passwordField = clazz.getDeclaredField("password");
		Column passwordColumn = passwordField.getAnnotation(Column.class);
		String passwordName = passwordColumn.name();
		String passwordType = passwordColumn.type();
		System.out.println("password属性对应数据库表的字段:" + passwordName + ",类型:" + passwordType);
		
		Field emailField = clazz.getDeclaredField("email");
		Column emailColumn = emailField.getAnnotation(Column.class);
		String emailName = emailColumn.name();
		String emailType = emailColumn.type();
		System.out.println("email属性对应数据库表的字段:" + emailName + ",类型:" + emailType);
	}
}

第二十二章

第一题

案例:

1、定义一个函数式接口CurrentTimePrinter,其中抽象方法void printCurrentTime(),使用注解@FunctionalInterface

2、在测试类中定义public static void showLongTime(CurrentTimePrinter timePrinter),该方法的预期行为是使用timePrinter打印当前系统时间

3、测试showLongTime(),通过lambda表达式完成需求

(1)实现一:打印当前系统时间毫秒值,用System. currentTimeMillis()

(2)实现二:打印当前系统时间,用Date

(3)实现三:打印本地化当前系统时间,用LocalDateTime

package com.atguigu.test01;
​
import java.time.LocalDateTime;
import java.util.Date;
​
public class Test01 {
    
    public static void main(String[] args) {
        showLongTime(() -> System.out.println(System.currentTimeMillis()));
        showLongTime(() -> System.out.println(new Date()));
        showLongTime(() -> System.out.println(LocalDateTime.now()));
    }
    
    public static void showLongTime(CurrentTimePrinter timePrinter){
        timePrinter.printCurrentTime();
    }
}
@FunctionalInterface
interface CurrentTimePrinter{
    void printCurrentTime();
}

第二题

案例:

1、定义一个函数式接口IntCalc,其中抽象方法int cal(int a , int b),使用注解@FunctionalInterface 2、在测试类中定义public static void getProduct(int a , int b ,IntCalc tools), 该方法的预期行为打印使用tools的cal(a,b)的计算结果 3、测试getProduct(),通过lambda表达式完成需求,其中a =1,b = 2

(1)实现一:求a,b的和

(2)实现二:求a,b的差

(3)实现三:求a,b的积

(4)实现四:求a,b的商

(5)实现五:求a,b的按位与

(6)实现六:求a<<b

package com.atguigu.test02;
​
public class Test02 {
    public static void main(String[] args) {
        getProduct(1,2,(a,b) -> a+b);
        getProduct(1,2,(a,b) -> a-b);
        getProduct(1,2,(a,b) -> a*b);
        getProduct(1,2,(a,b) -> a/b);
        getProduct(1,2,(a,b) -> a&b);
        getProduct(1,2,(a,b) -> a<<b);
    }
    
    public static void getProduct(int a , int b ,IntCalc tools){
        System.out.println("结果:" + tools.cal(a, b));
    }
}
@FunctionalInterface
interface IntCalc{
    int cal(int a , int b);
}

第三题

案例:

1、给出测试类代码如下:

package com.atguigu.test03;
​
import java.util.function.Supplier;
​
public class Test03 {
    public static <T> T getObj(Supplier<T> supplier) {
        return supplier.get();
    }
​
    public static void main(String[] args) {
        ....
    }
}
​

2、分别使用lambda表达式获得以下对象:

  • 长度为5的String数组

  • 包含5个1-20(含1和20)之间随机数的HashSet<Integer>集合

  • 一个代表2018年4月1日的Calendar对象

package com.atguigu.test03;
​
import java.util.Arrays;
import java.util.GregorianCalendar;
import java.util.HashSet;
import java.util.Random;
import java.util.function.Supplier;
​
public class Test03 {
    public static <T> T getObj(Supplier<T> supplier) {
        return supplier.get();
    }
​
    public static void main(String[] args) {
        String[] arr = getObj(() -> new String[5]);
        System.out.println(Arrays.toString(arr));
        
        Random rand = new Random();
        HashSet<Integer> nums = getObj(() -> {
            HashSet<Integer> set = new HashSet<Integer>();
            while(set.size()<5){
                set.add(rand.nextInt(20)+1);
            }
            return set;
        });
        System.out.println(nums);
        
        GregorianCalendar obj = getObj(() -> new GregorianCalendar(2019,5,13));
        System.out.println(obj);
    }
}
​

第四题

案例:

1、给出测试类代码如下:

package com.atguigu.test04;
​
import java.util.HashMap;
import java.util.function.Consumer;
​
public class Test04 {
    public static <T> void doJob(T t, Consumer<T> consumer) {
        consumer.accept(t);
    }
​
    public static <T> void doJob(T t, Consumer<T> consumer1, Consumer<T> consumer2) {
        consumer1.andThen(consumer2).accept(t);
    }
​
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<>();
​
        // key:姓名 value:成绩
        map.put("岑小村", 59);
        map.put("谷天洛", 82);
        map.put("渣渣辉", 98);
        map.put("蓝小月", 65);
        map.put("皮几万", 70);
        
    }
}

2、分别使用lambda表达式完成以下需求

  • 打印谷天洛的分数

  • 打印最高分

  • 分别以60分和70分为及格线,打印及格的人的名字(组合型消费)

package com.atguigu.test04;
​
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Consumer;
​
public class Test04 {
    public static <T> void doJob(T t, Consumer<T> consumer) {
        consumer.accept(t);
    }
​
    public static <T> void doJob(T t, Consumer<T> consumer1, Consumer<T> consumer2) {
        consumer1.andThen(consumer2).accept(t);
    }
​
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<>();
​
        // key:姓名 value:成绩
        map.put("岑小村", 59);
        map.put("谷天洛", 82);
        map.put("渣渣辉", 98);
        map.put("蓝小月", 65);
        map.put("皮几万", 70);
        
        //打印谷天洛的分数
        doJob(map, (m) -> System.out.println("谷天洛的分数:" + m.get("谷天洛")));
​
        //打印最高分
        doJob(map, (m) -> System.out.println("最高分:" + Collections.max(m.values())));
​
        //打印及格的人的名字
        doJob(map, (m) -> {
            System.out.print("60分及格的人:");
            for (Map.Entry<String, Integer> entry : m.entrySet()) {
                if (entry.getValue()>=60){
                    System.out.print(entry.getKey()+" ");
                }
            }
            System.out.println();
        }, (m) -> {
            System.out.print("70分及格的人:");
            for (Map.Entry<String, Integer> entry : m.entrySet()) {
                if (entry.getValue()>=70){
                    System.out.print(entry.getKey()+" ");
                }
            }
            System.out.println();
        });
    }
}
​

第五题

案例:

1、定义学生类: ​ (1)成员变量 姓名:String name; ​ (2)成员变量 成绩:int score; ​ (3)无参及全参构造 ​ (4)重写toString()

2、在测试类中完成如下要求 ​ (1)将五名学生添加到ArrayList集合 ​ (2)使用Collections.sort(List<T> list, Comparator<? super T> c)方法将学生成绩从小到大进行排序,分别使用以下三种形式实现: ​ a、使用匿名内部类 ​ b、使用Lambda表达式 ​ c、使用方法引用 //tips:借助Comparator接口中静态方法comparingInt()方法

3、学生信息与成绩如下:

姓名数学
谢霆锋85
章子怡63
刘亦菲77
黄晓明33
岑小村92
package com.atguigu.test05;
​
public class Student {
    private String name;
    private int score;
    
    public Student() {
    }
​
    public Student(String name, int score) {
        this.name = name;
        this.score = score;
    }
    
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    public int getScore() {
        return score;
    }
​
    public void setScore(int score) {
        this.score = score;
    }
​
    @Override
    public String toString() {
        return "Student{" + "name='" + name + '\'' + ", score=" + score + '}';
    }
}
package com.atguigu.test05;
​
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
​
public class Test05 {
    public static void main(String[] args) {
        ArrayList<Student> list = new ArrayList<>();
        list.add(new Student("谢霆锋", 85));
        list.add(new Student("章子怡", 63));
        list.add(new Student("刘亦菲", 77));
        list.add(new Student("黄晓明", 33));
        list.add(new Student("岑小村", 92));
​
        // 使用匿名内部类将成绩从小到大排序
        Collections.sort(list, new Comparator<Student>() {
​
            @Override
            public int compare(Student o1, Student o2) {
                return o1.getScore() - o2.getScore();
            }
        });
​
        // 使用Lambda为英语成绩从小到大排序
        Collections.sort(list, (o1, o2) -> o1.getScore() - o2.getScore());
​
        // 借助comparingInt()使用方法引用
        Collections.sort(list, Comparator.comparingInt(Student::getScore));
​
        System.out.println(list);
    }
}
​

第六题

案例:

1、声明一个员工类型Employee,包含编号、姓名、薪资、年龄、性别

2、声明一个员工管理类,

(1)管理类中使用ArrayList,来存储所有员工对象

(2)声明public void add(Employee emp)方法,添加员工

(3)声明public ArrayList get(Predicate<Employee> p)方法,可以根据条件筛选出符合要求的员工

(4)声明public void remove(Predicate<Employee> p)方法,可以根据条件删除

(5)声明public void update(Consumer<Employee> c)方法,对集合中的元素执行c指定的操作

3、在测试类

(1)添加5个员工对象到管理的集合中

(2)筛选出

①编号是偶数的员工

②薪资低于10000的员工

③年龄大于30岁的女员工

④姓张的员工

⑤所有员工

(3)删除

①年龄大于30岁的女员工

②删除“张三”这个员工

(4)给每个员工涨薪10%

package com.atguigu.test06;

public class Employee {
	private int id;
	private String name;
	private double salary;
	private int age;
	private char gender;
	public Employee(int id, String name, double salary, int age, char gender) {
		super();
		this.id = id;
		this.name = name;
		this.salary = salary;
		this.age = age;
		this.gender = gender;
	}
	public Employee() {
		super();
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public double getSalary() {
		return salary;
	}
	public void setSalary(double salary) {
		this.salary = salary;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public char getGender() {
		return gender;
	}
	public void setGender(char gender) {
		this.gender = gender;
	}
	@Override
	public String toString() {
		return "Employee [id=" + id + ", name=" + name + ", salary=" + salary + ", age=" + age + ", gender=" + gender
				+ "]";
	}
}

package com.atguigu.test06;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.function.Consumer;
import java.util.function.Predicate;

public class EmployeeService {
	private ArrayList<Employee> list;
	
	public EmployeeService(){
		list = new ArrayList<Employee>();
	}
	
	public void add(Employee emp){
		list.add(emp);
	}
	
	public ArrayList<Employee> get(Predicate<Employee> p){
		ArrayList<Employee> all = new ArrayList<Employee>();
		for (Employee employee : list) {
			if(p.test(employee)){
				all.add(employee);
			}
		}
		return all;
	}
	
	public void remove(Predicate<Employee> p){
		Iterator<Employee> iterator = list.iterator();
		while(iterator.hasNext()){
			Employee next = iterator.next();
			if(p.test(next)){
				iterator.remove();
			}
		}
	}
	
	public void update(Consumer<Employee> c){
		for (Employee employee : list) {
			c.accept(employee);
		}
	}
	
	public int size(){
		return list.size();
	}
}

package com.atguigu.test06;

import java.util.ArrayList;

import org.junit.After;
import org.junit.BeforeClass;
import org.junit.Test;

public class Test06 {
	private static EmployeeService es = new EmployeeService();
	@BeforeClass
	public static void test01(){
		es.add(new Employee(1, "张三", 8000, 23, '男'));
		es.add(new Employee(2, "王小二", 12000, 22, '男'));
		es.add(new Employee(3, "李四", 12000, 24, '女'));
		es.add(new Employee(4, "王五", 11000, 34, '女'));
		es.add(new Employee(5, "赵六", 6000, 34, '女'));
	}
	@Test
	public void testSize(){
		System.out.println("目前员工数量:" + es.size());
	}
	
	@Test
	public void testRemove1(){
		//删除年龄大于30岁的女员工
		System.out.println("删除年龄大于30岁的女员工");
		es.remove(e->e.getAge()>30 && e.getGender()=='女');
	}
	
	@Test
	public void testRemove2(){
		//删除“张三”这个员工
		System.out.println("删除“张三”这个员工");
		es.remove(e->e.getName().startsWith("张"));
	}
	
	@Test
	public void testRemove3(){
		System.out.println("每个人涨薪资10%");
		es.update(e -> e.setSalary(e.getSalary()*1.1));
	}
	
	@After
	public void test(){
		System.out.println("编号是偶数的员工有:");
		ArrayList<Employee> list1 = es.get(e->e.getId()%2==0);
		for (Employee employee : list1) {
			System.out.println(employee);
		}
		
		System.out.println("薪资低于10000的员工有:");
		ArrayList<Employee> list2 = es.get(e->e.getSalary()<10000);
		for (Employee employee : list2) {
			System.out.println(employee);
		}
		
		System.out.println("年龄大于30岁的女员工有:");
		ArrayList<Employee> list3 = es.get(e->e.getAge()>30 && e.getGender()=='女');
		for (Employee employee : list3) {
			System.out.println(employee);
		}
		
		System.out.println("姓张的员工有:");
		ArrayList<Employee> list4 = es.get(e->e.getName().startsWith("张"));
		for (Employee employee : list4) {
			System.out.println(employee);
		}
		
		System.out.println("所有员工有:");
		ArrayList<Employee> list5 = es.get(e -> true);
		for (Employee employee : list5) {
			System.out.println(employee);
		}
		System.out.println();
	}
	
	
}

第七题

案例:

1、已知学生成绩如下

姓名成绩
岑小村59
谷天洛82
渣渣辉98
蓝小月65
皮几万70

以学生姓名为key成绩为value创建集合并存储数据

2、使用lambda表达式分别将以下功能封装到Function对象中

(1)将Map<String,Integer>中value存到ArrayList<Integer>中

(2)求Integer类型ArrayList中所有元素的平均数

3、使用Function对象求学生的平均值

package com.atguigu.test07;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;

public class Test07 {
	public static void main(String[] args) {
//		将学生姓名和成绩封装到map中
		HashMap<String,Integer> map = new HashMap<String, Integer>();
        map.put("岑小村", 59);
        map.put("谷天洛", 82);
        map.put("渣渣辉", 98);
        map.put("蓝小月", 65);
        map.put("皮几万", 70);
        
//        将Map<String,Integer>中value存到ArrayList<Integer>中
        Function<Map<String,Integer>,ArrayList<Integer>> f1 = (m)->{
            ArrayList<Integer> list = new ArrayList<>();
            list.addAll(m.values());
            return list;
        };
        
//        求Integer类型ArrayList中所有元素的平均数
        Function<ArrayList<Integer>,Double> f2 = (list)->{
            double sum = 0;
            for (Integer i : list) {
                sum+=i;
            }
            return sum/list.size();
        };
        
        //利用Function求平均成绩
        Double avg = f1.andThen(f2).apply(map);
        System.out.println("学生平均成绩为:"+avg);
	}
}

第八题

现在有两个 ArrayList 集合存储队伍当中的多个成员姓名,

List<String> one = new ArrayList<>();
		one.add("清风");
		one.add("陈玄风");
		one.add("梅超风");
		one.add("陆乘风");
		one.add("曲灵风");
		one.add("武眠风");
		one.add("冯默风");
		one.add("罗玉风");

		List<String> two = new ArrayList<>();
		two.add("宋远桥");
		two.add("俞莲舟");
		two.add("俞岱岩");
		two.add("张松溪");
		two.add("张翠山");
		two.add("殷梨亭");
		two.add("张声谷");

要求使用Stream方式进行以下若干操作步骤:

  1. 第一个队伍只要名字为3个字的成员姓名;

  2. 第一个队伍筛选之后只要前4个人;

  3. 第二个队伍只要姓张的成员姓名;

  4. 第二个队伍筛选之后不要前1个人;

  5. 将两个队伍合并为一个队伍;

  6. 根据姓名创建Student对象;Student类型包含name属性

  7. 打印整个队伍的Student对象信息。

package com.atguigu.test08;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

public class Test08 {
	public static void main(String[] args) {
		List<String> one = new ArrayList<>();
		one.add("清风");
		one.add("陈玄风");
		one.add("梅超风");
		one.add("陆乘风");
		one.add("曲灵风");
		one.add("武眠风");
		one.add("冯默风");
		one.add("罗玉风");

		List<String> two = new ArrayList<>();
		two.add("宋远桥");
		two.add("俞莲舟");
		two.add("俞岱岩");
		two.add("张松溪");
		two.add("张翠山");
		two.add("殷梨亭");
		two.add("张声谷");

		// 第一个队伍只要名字为3个字的成员姓名;
		// 第一个队伍筛选之后只要前4个人;
		Stream<String> streamOne = one.stream().filter(s -> s.length() == 3).limit(6);

		// 第二个队伍只要姓张的成员姓名;
		// 第二个队伍筛选之后不要前1个人;
		Stream<String> streamTwo = two.stream().filter(s -> s.startsWith("张")).skip(1);

		// 将两个队伍合并为一个队伍;
		// 根据姓名创建Student对象;
		// 打印整个队伍的Student对象信息。
		Stream.concat(streamOne, streamTwo).map(Student::new).forEach(System.out::println);
	}
}

class Student {
	private String name;

	public Student() {
	}

	public Student(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	@Override
	public String toString() {
		return " Student {name='" + name + "'}";
	}
}

第九题

案例:

以下是某不知名机构评出的全球最佳影片及华人最佳影片前十名 :

全球   1、 《教父》   2、 《肖申克的救赎》   3、 《辛德勒的名单》   4、 《公民凯恩》   5、 《卡萨布兰卡》   6、 《教父续集》   7、 《七武士》   8、 《星球大战》   9、 《美国美人》   10、 《飞跃疯人院》  

华人

  1、 《霸王别姬》   2、 《大闹天宫》   3、 《鬼子来了》   4、 《大话西游》   5、 《活着》   6、 《饮食男女》   7、 《无间道》   8、 《天书奇谭》   9、 《哪吒脑海》   10、 《春光乍泄》

1、现将两个榜单中的影片名,分别按排名顺序依次存入两个ArrayList集合

2、通过流的方式

1)打印全球影片排行榜中的前三甲影片名

2)打印华人影片排行榜中倒数5名的影片名

3)将两个排行榜中的前5名挑出来共同存入新的集合

4)定义电影Film类,以影片名为name创建Film对象并保存至集合,Film类型包含影片名属性

package com.atguigu.test09;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Test09 {
	public static void main(String[] args) {
		// 将原始数据存入集合
		ArrayList<String> global = new ArrayList<>();
		global.add("《教父》");
		global.add("《肖申克的救赎》");
		global.add("《辛德勒的名单》");
		global.add("《公民凯恩》");
		global.add("《卡萨布兰卡》");
		global.add("《教父续集》");
		global.add("《七武士》");
		global.add("《星球大战》");
		global.add("《美国美人》");
		global.add("《飞跃疯人院》");
		
		ArrayList<String> china = new ArrayList<>();
		china.add("《霸王别姬》");
		china.add("《大闹天宫》");
		china.add("《鬼子来了》");
		china.add("《大话西游》");
		china.add("《活着》");
		china.add("《饮食男女》");
		china.add("《无间道》");
		china.add("《天书奇谭》");
		china.add("《哪吒脑海》");
		china.add("《春光乍泄》");

		// 1)打印全球影片排行榜中的前三甲影片名
		global.stream().limit(3).forEach(System.out::println);
		System.out.println();

		// 2)打印华人影片排行榜中倒数5名的影片名
		china.stream().skip(china.size() - 5).forEach(System.out::println);
		System.out.println();

		// 3)将两个排行榜中的前5名挑出来共同存入新的集合
		List<String> list = Stream.concat(global.stream().limit(5), china.stream().limit(5))
				.collect(Collectors.toList());
		for (String string : list) {
			System.out.println(string);
		}
		System.out.println();

		// 4)将所有影片以影片名为name创建Film对象并保存至集合
		List<Film> filmList = Stream.concat(global.stream(), china.stream()).map(Film::new)
				.collect(Collectors.toList());
		for (Film film : filmList) {
			System.out.println(film);
		}
	}
}

class Film {
	private String name;

	public Film() {
	}

	public Film(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "Film [name=" + name + "]";
	}
	
}

第十题

我国有34个省级行政区,分别是:

23个省:

河北省、山西省、吉林省、辽宁省、黑龙江省、陕西省、甘肃省、青海省、山东省、福建省、浙江省、台湾省、河南省、湖北省、湖南省、江西省、江苏省、安徽省、广东省、海南省、四川省、贵州省、云南省。

4个直辖市:

北京市、天津市、上海市、重庆市。

5个自治区:

内蒙古自治区、新疆维吾尔自治区、[夏回族自治区、广西壮族自治区、西藏自治区

2个特别行政区:

香港特别行政区、澳门特别行政区

使用流:

1、统计三个字的省份的个数

2、统计名字中包含方位名词的省份(东西南北)的个数

3、打印名字中包含方位名词的普通省份(非自治区直辖市特别行政区)的名字

4、将所有的特殊省份(自治区直辖市特别行政区)提取出来并放到新数组中

package com.atguigu.test10;

import java.util.Arrays;
import java.util.stream.Stream;

public class Test10 {
	public static void main(String[] args) {
		String[] provinces = { "河北省", "山西省", "吉林省", "辽宁省", "黑龙江省", "陕西省", "甘肃省", "青海省", "山东省", "福建省", "浙江省", "台湾省",
				"河南省", "湖北省", "湖南省", "江西省", "江苏省", "安徽省", "广东省", "海南省", "四川省", "贵州省", "云南省", "北京市", "天津市", "上海市", "重庆市",
				"内蒙古自治区", "新疆维吾尔自治区", "宁夏回族自治区", "广西壮族自治区", "西藏自治区", "香港特别行政区", "澳门特别行政区" };

		// 1、统计三个字的省份的个数
		long threeCount = Stream.of(provinces).filter(s -> s.length() == 3).count();
		System.out.println("三个字的省份的个数:" + threeCount);

		// 2、统计名字中包含方位名词的省份(东西南北)的个数
		long count = Stream.of(provinces)
				.filter(s -> s.contains("东") || s.contains("西") || s.contains("南") || s.contains("北")).count();
		System.out.println("包含方位名词的省份(东西南北)的个数:" + count);

		// 3、打印名字中包含方位名词的普通省份(非自治区直辖市特别行政区)的名字
		System.out.println("包含方位名词的普通省份有:");
		Stream.of(provinces).filter(s -> s.contains("东") || s.contains("西") || s.contains("南") || s.contains("北"))
				.filter(s -> s.contains("省")).forEach(System.out::println);

		// 4、将所有的特殊省份(自治区直辖市特别行政区)提取出来并放到新数组中
		String[] pros = Stream.of(provinces).filter(s -> !s.contains("省")).toArray(String[]::new);
		System.out.println("新数组:" + Arrays.toString(pros));
	}
}

  • 6
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骨灰级宅神

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值