第15周java学习总结--面向对象综合练习,String,ArrayList

本周主要学习了黑马的92-115主要包含以下内容:
面向对象综合练习,String,ArrayList

本周学习内容目录

  • 一.面向对象综合练习
    • 1.文字版格斗游戏
    • 2.复杂数组对象练习(较难)
  • 二.String
    • 1.字符串的创建
      • (1).直接赋值
      • (2).new创建对象
    • 2.字符串练习题(带有常见string方法)
      • -练习题:用户登录
      • -练习题:统计字符次数
      • -练习题:字符串反转
      • -练习题:金额转换
      • -练习题:不显示完整手机号
      • -练习题:敏感词替换
      • -转换罗马数字
    • 3.StringBuilder
      • (1).简述
      • (2).构造方法
      • (3).常用方法
      • (4).应用场景
      • (5).练习:字符串的拼接
    • 4.StringJoiner
      • (1).构造方法
      • (2).成员方法
  • 三.ArrayList
    • 1.集合和数组的对比
      • (1).长度
      • (2).存储类型
    • 2.创建集合的对象
    • 3.成员方法
      • (1).增
      • (2).删
      • (3).改
      • (4).查
    • 4.集合练习
      • -添加手机对象并返回多个数据
  • 四.本周小结

一.面向对象综合练习

1.文字版格斗游戏

请看我的上篇文章(~ ̄(OO) ̄)ブ
第十四周Java学习总结

2.复杂数组对象练习(较难)

第15周java学习总结--面向对象综合练习,String,ArrayList_第1张图片
前两个要求的代码如下

public class Test1 {
    public static void main(String[] args) {
        //1.创建学生数组
        Student[] arr = new Student[3];
        //2.创建学生对象3.存到数组中
        Student stu1 = new Student("1", "小明", 18);
        Student stu2 = new Student("2", "小红", 19);
        Student stu3 = new Student("3", "小壮", 20);
        arr[0] = stu1;
        arr[1] = stu2;
        arr[2] = stu3;
        //要求1.再次添加一个学生对象,并在添加的时候进行学号的唯一性判断。
        Student stu4 = new Student("4", "小强", 21);
        //(1).唯一性判断
        boolean flag = contain(arr, stu4.getId());
        if (flag) {
            System.out.println("学号已存在,添加失败");
        } else {
            //(2).将对象存入数组中
            //数组存满就创建新数组,长度为老数组长度+1
            int count = arrNum(arr);
            if (count == arr.length) {
                //存满去创建新数组,将老数组的数据拷贝到新数组中
                Student[] newArr = newArr(arr);
                newArr[count] = stu4;
                //要求2:遍历学生信息
                bianLi(newArr);
            } else {
                //没存满
                arr[count] = stu4;
                //要求2:遍历学生信息
                bianLi(arr);
            }
        }
    }
    //1.我需要干啥?---判断是否存在
    //2.我干这件事,需要什么才能完成?----数组,id
    //3.调用处是否需要继续使用方法的结果?---需要将结果拿出来判断q
    public static boolean contain(Student[] arr, String id) {
        for (int i = 0; i < arr.length; i++) {
            Student stu = arr[i];//依次获取学生对象
            String sid = stu.getId();//获取数组对象的id
            if (id.equals(sid)) {
                return true;
            }
        }
        return false;
    }
    //定义方法判断数组中已存入多少元素
    public static int arrNum(Student[] arr) {
        int count = 0;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] != null) {
                count++;
            }
        }
        return count;
    }
    //定义方法去创建新数组
    public static Student[] newArr(Student[] arr) {
        Student[] newArr = new Student[arr.length + 1];
        for (int i = 0; i < arr.length; i++) {
            newArr[i] = arr[i];
        }
        return newArr;
    }
    //定义方法遍历数组
    public static void bianLi(Student[] arr) {

        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i].getId() + "," + arr[i].getName() + "," + arr[i].getAge());
        }
    }
}

后三个要求的代码如下:

public class Test1 {
public static void main(String[] args) {
        //1.创建学生数组
        Student[] arr = new Student[3];
        //2.创建学生对象3.存到数组中
        Student stu1 = new Student("1", "小明", 18);
        Student stu2 = new Student("2", "小红", 19);
        Student stu3 = new Student("3", "小壮", 20);
        arr[0] = stu1;
        arr[1] = stu2;
        arr[2] = stu3;
        /*要求3:通过id刪除学生信息
        如果存在,则删除,如果不存在,则提示删除失败。*/
        //找到id在数组中的索引
        int index = find(arr, "2");
        if (index >= 0) {
            //如果存在就删除
            arr[index] = null;
        } else System.out.println("该id不存在,删除失败");
        //要求4:删除完之后,遍历所有学生信息
        bianLi(arr);
        //要求5:查询数组id为“2”的学生,如果存在,则将他的年龄+1岁
        int index2 = find(arr, "2");
        if (index2 > 0) {
            //存在
            Student stu = arr[index2];
            int newAge = stu.getAge();
            stu.setAge(newAge);
        } else System.out.println("当前id不存在,修改失败");
    }

    //定义方法找到id在数组中的索引
    public static int find(Student[] arr, String id) {
        for (int i = 0; i < arr.length; i++) {
            Student stu = arr[i];
            String sid = stu.getId();
            if (id == sid) {
                return i;
            }
        }
        return -1;
    }
    //定义方法遍历数组
    public static void bianLi(Student[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i].getId() + "," + arr[i].getName() + "," + arr[i].getAge());
        }
    }
}

二.String

1.字符串的创建

字符串的内容是不会发生改变的,它的对象在创建后不能被更改

(1).直接赋值

String 变量名=“字符串”;

(2).new创建对象

[1].public String()-------创建空白字符串
[2].public String(char[] chs)-------根据字符数组创建字符串对象
[3].public String(byte[] chs)-------根据字节数组创建字符串对象

例.

    char[] chs= {'a','b','c','d'};
	String s4=new String(chs);
	System.out.println(s4);//abcd
    byte[] chs= {97,98,99,100};
	String s5=new String(chs);
	System.out.println(s5);//abcd

2.字符串练习题(带有常见string方法)

-练习题:用户登录

方法:boolean equals(要比较的字符串)-------两个字符串比较
boolean equalsIgnoreCase(要比较的字符串)-------同上,但不区分大小写

第15周java学习总结--面向对象综合练习,String,ArrayList_第2张图片

package bb;
import java.util.Scanner;
public class Demo5 {
public static void main(String[] args) {
		//1.给定正确的用户名和密码
		String rightName="piggyOne";
		String rightPassword="123456";
		//2.键盘输入
		Scanner sc=new Scanner(System.in);
		for (int i = 0; i < 3; i++) {
			System.out.println("请输入用户名");
			String name=sc.next();
			System.out.println("请输入密码");
			String password=sc.next();
		if (name.equals(rightName) && password.equals(rightPassword)) {
				System.out.println("登录成功");
				break;
			} else {
              System.out.println("登录失败,您还剩"+(2-i)+"次机会");
			}
		}
	}
}

注意:==号的使用,基本数据类型比的是数据值,引用数据类型比的是地址值
比较字符串建议用
equals()方法

-练习题:统计字符次数

方法:char charAt(int index)-------返回index指定位置的字符

在这里插入图片描述

Scanner sc=new Scanner(System.in);
		System.out.println("请输入字符串:");
		String str=sc.nextLine();
	    int bigCount=0;
	    int smallCount=0;
	    int number=0;
	    for (int i = 0; i < str.length(); i++) {
			char c=str.charAt(i);
			if (c>='a'&&c<='z') {//ASCII表对照
		//char类型的变量在参与计算时自动类型提升为int,查ascii
				smallCount++;
			}else if(c>='A'&&c<='Z'){
                bigCount++;
			}else if(c>='0'&&c<='9') {//数字字符比较
				number++;
			}
		}
	    System.out.println("大写字母有"+bigCount+"个");
		System.out.println("小写字母有"+smallCount+"个");
		System.out.println("数字有"+number+"个");

-练习题:字符串反转

不使用StringBuilder的普通方法
第15周java学习总结--面向对象综合练习,String,ArrayList_第3张图片

package bb;
import java.util.Scanner;
public class Demo5 {
public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		System.out.println("请输入字符串");
		String str=sc.next();
		System.out.println(reverse(str));
	}
	
	//创建方法时需要询问自己以下问题:
	//1.我需要干啥?---字符串的反转
	//2.我干这件事,需要什么才能完成?----字符串
	//3.调用处是否需要继续使用方法的结果?---需要将结果输出
	public static String reverse(String str) {
		String result="";
		for (int i =str.length()-1; i>=0;i--) {
			char c=str.charAt(i);
			result=result+c;//
		}return result;
	}
}

创建方法时需要询问自己以下问题:
1.我需要干啥?
2.我干这件事,需要什么才能完成?
3.调用处是否需要继续使用方法的结果?

-练习题:金额转换

题目+思路:
第15周java学习总结--面向对象综合练习,String,ArrayList_第4张图片

package bb;
import java.util.Scanner;
public class Demo5 {
public static void main(String[] args) {
		//1.键盘输入金额
		Scanner sc=new Scanner(System.in);
		int money;
		while(true) {
		System.out.println("请输入金额");
		money=sc.nextInt();
		if (money>=0&&money<=9999999) {
			break;
		} else {
        System.out.println("金额无效,请重新输入");
		  }
		}
		//2.得到每一位数字,再转成中文
		String moneyHanzi="";//定义一个变量表示钱的大写
		while (true) {
			//从右向左获取数字
			int num=money%10;
			//把转换后的大写拼接到moneyHanzi中
	   String numToHanzi=numToHanzi(num);
	   moneyHanzi=numToHanzi+moneyHanzi;//两个相加的顺序不能变
	    //第一次循环:"叁"+""="叁"
	   //第二次循环:"贰"+"叁"="贰叁"
	   //........
	        money=money/10;//去掉刚才获得的数据
			if (money==0) {
				break;
			}
		}
		//3.补零
		int count=7-moneyHanzi.length();
		for (int i =count; i>0; i--) {
	     moneyHanzi="零"+moneyHanzi;
		}
		//4.插入单位
		//遍历moneyHanzi,再将dw插进去
		String[] dw= {"佰","拾","万","仟","佰","拾","元"};
		String result="";
		for (int i =0;i<moneyHanzi.length();i++) {
			char c=moneyHanzi.charAt(i);
			//把大写汉字和单位拼进去
			result=result+c+dw[i];
		}
		System.out.println(result);
	}
	
	//1.定义一个方法把数字变成大写的汉字
	public static String numToHanzi(int num) {
		String[] chs= {"零","壹","贰","叁","肆","伍","陆","柒","扒","玖"};
		return chs[num];
	}
}

-练习题:不显示完整手机号

方法:String substring(int beginIndex,int endIndex)-------截取
注意点:包头不包尾
String substring(int endIndex)-------截取到末尾

package bb;
public class Demo5 {
public static void main(String[] args) {
		String phoneNum="13497615736";//随便打的手机号
		//1.截取前三位
		String start=phoneNum.substring(0,3);
		//2.截取后四位
		String end=phoneNum.substring(7, 11);
		//3.拼接
		String result=start+"****"+end;
		System.out.println(result);
	}
}

-练习题:敏感词替换

方法:String replace(旧值,新值)-------替换

package bb;
public class Demo5 {
public static void main(String[] args) {
		//1.获取要说的话
		String talk= "你玩得很好,下次不要玩了,cnm,nmsl,tmd";
		//2.创建敏感词库
		String[] chs= {"cnm","nmsl","tmd","rnm"};
		//3.替换
		for (int i = 0; i < chs.length; i++) {
			talk=talk.replace(chs[i], "***");
		}
		System.out.println(talk);
	}
}

-转换罗马数字

第15周java学习总结--面向对象综合练习,String,ArrayList_第5张图片

import java.util.Scanner;
public class Test1 {
    public static void main(String[] args) {
        String str;
        while (true) {
            //1.创建字符串
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入字符");
            str = sc.next();
            if (checkStr(str)) {
                break;
            } else {
                System.out.println("字符不合规,请重新输入`");
            }
        }
        //2.将数字变成罗马数字
        //查表法:数字跟数据产生对应关系
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            int num = c - 48;//ascii中0对应48
            sb.append(toLuoMa(num));
        }
        System.out.println(sb);
    }

    //2.定义方法校验字符串
    public static boolean checkStr(String str) {
        if (str.length() > 9) {
            return false;
        }
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            if (c < '0' || c > '9') {
                return false;
            }
        }
        return true;
    }

    //定义将数字变成罗马数字的方法
    public static String toLuoMa(int num) {
        String[] chs = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};
        return chs[num];
    }
}

3.StringBuilder

(1).简述

StringBuilder可以看成是一个容器,创建之后里面的内容是可变的
作用:提高字符串的操作效率

(2).构造方法

public StringBuilder()-------创建一个空白可变字符串对象,不含任何内容
public StringBuilder(String str)-------根据字符串的内容来创建可变字符串对象

(3).常用方法

pubilc StringBuilder append(任意类型)-------添加数据并返回对象本身
pubilc StringBuilder reverse()-------反转容器的内容
pubilc int length()-------返回长度(字符出现个数)
public String toString()-------把StringBuilder转换为String

例.

StringBuilder sb=new StringBuilder("abc");//创建对象
	//1.添加字符串
	 sb.append(1.3);//abc1.3
	//2.反转	
	 sb.reverse();//cba
	//3.获取长度
	 int len=sb.length();
	System.out.println(len);//6
	//4.再把StringBuilder变回字符串
	String str=sb.toString();
	System.out.println(str);

链式编程:当我们在调用一个方法时,不需要用变量接收它的结果,可以继续调用其他方法
例.

int len2=sb.append(1.3).length();
sb.append("aaa").append("bbb").append("ccc").append("ddd");

(4).应用场景

字符串的拼接和反转

(5).练习:字符串的拼接

第15周java学习总结--面向对象综合练习,String,ArrayList_第6张图片

package bb;
public class Demo5 {
public static void main(String[] args) {
		int[] arr= {1,2,3};
		//2.调用方法将数组变成字符串
		String newArr=creatArr(arr);
		System.out.println(newArr);
	}
	
	//1.定义一个方法拼接字符串
	public static String creatArr(int[] arr) {
		StringBuilder sb=new StringBuilder();
		sb.append("[");
		for (int i = 0; i < arr.length; i++) {
			if (i==arr.length-1) {
				sb.append(arr[arr.length-1]).append("]");
			} else {
               sb.append(arr[i]).append(",");
			}
		}return sb.toString();
	}
}

4.StringJoiner

方便的拼接字符串

(1).构造方法

pubilc StringJoiner(间隔符号)-------创建对象,指定拼接时的间隔符号
public StringJoiner(间隔符号,开始符号,结束符号)---------创建对象并…

例.

StringJoiner sj=new StringJoiner(",","[","]");
	sj.add("aaa").add("bbb").add("ccc");
	System.out.println(sj);//[aaa,bbb,ccc]

(2).成员方法

public StringJoiner add(添加的内容)-------添加数据
public int length()-------返回长度(字符出现的个数),如上方的例子长度为13
public String toString()-------返回字符串

用法与StringBuilder相似,所以不再给例子

三.ArrayList

集合

1.集合和数组的对比

(1).长度

数组的长度是固定的,而集合的长度是可变的

(2).存储类型

数组中既可以存基本数据类型,也可以存引用数据类型
集合中可以存引用数据类型,而存储基本数据类型时需要把它变成相应的包装类
第15周java学习总结--面向对象综合练习,String,ArrayList_第7张图片

2.创建集合的对象

先引申一个概念

泛型:限定集合中存储数据的类型

 ArrayList<String> list=new ArrayList<>();//创建对象的格式,string可替换

-表示只能存入字符串的空集合
其中list的打印结果是 [ ]

打印对象不是地址值,而是集合中存储的数据内容
在展示时会拿[ ]把所有的数据进行包裹

3.成员方法

(1).增

boolean add(E e)------添加元素,返回值表示是否添加成功

        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        System.out.println(list);//结果是[aaa, bbb, ccc]

(2).删

boolean remove(E e)------删除指定元素,返回值表示是否删除成功

        boolean result1= list.remove("aaa");
        System.out.println(result1);//删除成功,返回true
        System.out.println(list);//集合变为[bbb, ccc]

        boolean result2= list.remove("ddd");
        System.out.println(result2);//集合中无ddd,删除失败,返回false
        System.out.println(list);//集合变为[bbb, ccc]

E remove(int index)------删除指定索引的元素,返回被删除的元素

        String str=list.remove(0);//删除索引在0处的元素
        System.out.println(str);//返回被删除的索引为0的元素aaa
        System.out.println(list);//集合变为[bbb, ccc]

(3).改

E set(int index,E e)------修改指定索引的元素,返回原来的元素

        String str= list.set(0,"ddd");//将0索引处的元素改为ddd
        System.out.println(str);//返回改变前的元素aaa
        System.out.println(list);//集合变为[ddd, bbb, ccc]

(4).查

E get(int index)------获取指定索引的元素

        String str= list.get(0);//获取0索引处的元素
        System.out.println(str);//结果为aaa

int size()------集合的长度,也就是集合中元素的个数

应用:

        for (int i = 0; i < list.size(); i++) {//打印出集合的各个元素
            String str= list.get(i);
            System.out.println(str);
        }

4.集合练习

-添加手机对象并返回多个数据

第15周java学习总结--面向对象综合练习,String,ArrayList_第8张图片

import java.util.ArrayList;
public class Test1 {
public static void main(String[] args) {
        ArrayList<Phone> list = new ArrayList<>();
        Phone p1 = new Phone("小米", 1000);
        Phone p2 = new Phone("苹果", 8000);
        Phone p3 = new Phone("锤子", 2999);
        list.add(p1);
        list.add(p2);
        list.add(p3);
        ArrayList<Phone> resultList = findPhInfo(list);
        for (int i = 0; i < resultList.size(); i++) {
            Phone p = resultList.get(i);
            System.out.println(p.getBrand() + "," + p.getPrice());
        }
    }
    //定义一个方法返回价格低于3000的手机的信息
    //技巧:如果要返回多个数据,可以把这些数据先放到一个容器中,再把容器返回
    public static ArrayList<Phone> findPhInfo(ArrayList<Phone> list) {
        ArrayList<Phone> resultList = new ArrayList<>();
        for (int i = 0; i < list.size(); i++) {
            Phone p = list.get(i);
            int price = p.getPrice();
            if (price < 3000) {
                resultList.add(p);
            }
        }
        return resultList;
   }

其中的JavaBean类Phone如下

public class Phone {
    private String brand;
    private int price;
    public Phone() {
    }
    public Phone(String brand, int price) {
        this.brand = brand;
        this.price = price;
    }
    public String getBrand() {
        return brand;
    }
    public void setBrand(String brand) {
        this.brand = brand;
    }
    public int getPrice() {
        return price;
    }
    public void setPrice(int price) {
        this.price = price;
    }
}

四.本周小结

本周学会了用markdown编写我的第二期博客,与第一期博客相比进步很多,上周写的我现在不忍直视 .
同时黑马程序员Java零基础视频教程_上部(2022新版)讲的很细,上面有啥没看懂,可以直接去他的视频找┑( ̄Д  ̄)┍.
继续学习,下周再见ヾ( ̄▽ ̄)ByeBye

你可能感兴趣的:(周记,java,学习,算法)