集合基础(黑马就业)
第一部分:ArrayList集合
集合和数组的区别
-
1.使用对象数组存储并输出对象
-
domain类
package com.domin;
//Student的domain类
public class Student {
private String name;
private int age;
private String sex;
public Student() {
}
public Student(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(int age) {
this.age = age;
}
/**
* 获取
* @return sex
*/
public String getSex() {
return sex;
}
/**
* 设置
* @param sex
*/
public void setSex(String sex) {
this.sex = sex;
}
public String toString() {
return "Student{name = " + name + ", age = " + age + ", sex = " + sex + "}";
}
}
- 测试类
package com.domin.OOP;
import com.domin.Student;
public class TestObjectArray {
public static void main(String[] args) {
//定义一个Student对象数组
Student [] students = new Student[3];
Student s1 = new Student("张三",12,"男");
Student s2 = new Student("李四",12,"男");
Student s3 = new Student("王五",12,"男");
students[0] = s1;//引用传递
students[1] = s2;//引用传递
students[2] = s3;//引用传递
//遍历数组
for (int i = 0; i < students.length; i++) {
System.out.println(students[i].getName());
System.out.println(students[i].getAge());
System.out.println(students[i].getSex());
}
}
}
如果存储的数据长度经常发生改变,推荐使用集合
ArrayList集合的构造方法和添加方法
ArrayList的容量可变,底层也是通过数组来完成的
- 一段示例代码
package com.domin.OOP;
import java.util.ArrayList;
public class ArrayListTest {
public static void main(String[] args) {
//1.空参构造创建一个容量为10的空列表
ArrayList list = new ArrayList();
//2.添加数据
list.add("hello");
list.add(1);
list.add(false);
System.out.print(list.toString());
}
}
可以看出集合中可以添加不同数据类型的数据,但是这样不太好。这里可以添加成功其实是泛型类型没有写,默认使用Object接收,但是这样可能会导致泛型错误
可以通过添加泛型来控制集合中添加数据的类型
主要有2种:(E e)将任意元素添加到尾部,(int index,E element)添加到指定的索引位置
- 总结
ArrayList常见成员方法(增删改查)
package com.domin.OOP;
import java.util.ArrayList;
import java.util.Collections;
public class ArrayListTest {
public static void main(String[] args) {
//ArrayList集合的增删改查操作
//1.原始数据
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list,"aaa","bbb","ccc","ddd");
System.out.println(list);//[aaa, bbb, ccc, ddd]
//2.删除:boolean remove(Object o)根据元素删除
final boolean flag = list.remove("aaa");
System.out.println(list);//[bbb, ccc, ddd]
//根据索引进行删除(返回被删除的元素)
final String remove = list.remove(0);
System.out.println(remove);//bbb
System.out.println(list);//[ccc, ddd]
//3.修改元素(根据索引修改)返回被修改的元素
final String eee = list.set(0, "eee");
System.out.println(eee);//ccc
System.out.println(list);//[eee, ddd]
//4.get(int index)返回指定索引的元素
final String s = list.get(0);
System.out.println(s);//eee
//5.size返回集合中元素的个数
final int size = list.size();
System.out.println(size);//2
}
}
刚刚演示的方法中大多都有返回值,但是在实际的运用中一般都不进行接收
案例:存储字符串并遍历
集合对象.fori,idea可以快捷便利集合
package com.domin.OOP;
import java.util.ArrayList;
public class ArrayListTraverse {
public static void main(String[] args) {
//1.创建ArrayList集合对象
ArrayList<String> list = new ArrayList<String>();
//2.往集合中添加字符串
list.add("aaa");
list.add("bbb");
list.add("ccc");
//3.遍历集合
for (int i = 0; i < list.size(); i++) {
//使用get方法获取集合中的元素
final String s = list.get(i);
System.out.println(s);
}
System.out.println(list.size());
}
}
键盘录入学生信息到集合
ctrl+alt+m将选取的内容抽取成方法
package com.domin.OOP;
import com.domin.Student;
import java.util.ArrayList;
import java.util.Scanner;
public class ArrayListTraverse {
public static void main(String[] args) {
//1.学生的信息已经定义
//2.创建集合对象
ArrayList<Student> list = new ArrayList<Student>();
//3.键盘录入学生对象需要的信息
System.out.println("请输入录入的学生的人数:");
Scanner sc = new Scanner(System.in);
getStudent(list, sc);
//4.遍历集合
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i).getName());
System.out.println(list.get(i).getAge());
System.out.println(list.get(i).getSex());
}
}
private static void getStudent(ArrayList<Student> list, Scanner sc) {
//将键盘录入的学生信息封装成对象
final int sum = sc.nextInt();
for (int i = 0; i < sum; i++) {
System.out.printf("请输入第%d个学生的姓名:\n", i + 1);
String name = getString(sc);
System.out.printf("请输入第%d个学生的年龄:\n", i + 1);
int age = sc.nextInt();
System.out.printf("请输入第%d个学生的性别:\n", i + 1);
String sex = sc.next();
Student s = new Student(name, age, sex);
list.add(s);//将对象添加到集合中
}
}
private static String getString(Scanner sc) {
String name = sc.next();
return name;
}
}
案例:删除集合中的元素
目的是删除集合中所有的test,1.通过remove(E e)中的返回值判断是否删除完毕(remove(E e)可以每次删除前面的e元素,循环一直删除即可),2.通过判断元素equals等于test即可删除(使用remove(int index))即可
package com.domin.OOP;
import com.domin.Student;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
public class ArrayListTraverse {
public static void main(String[] args) {
//1.创建集合对象并添加测试数据
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list,"test","张三","李四","test","test");
System.out.println(list);
//removeElement(list);
removeElement1(list);
//3.遍历集合
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
public static void removeElement1(ArrayList<String> list){
//(通过remove(int index)
//通过索引获取元素
for (int i = 0; i < list.size(); i++) {
final String s = list.get(i);
//比较equals
if("test".equals(s)){
list.remove(i);
}
}
}
private static void removeElement(ArrayList<String> list) {
//2.删除集合中所有的test(通过remove(E e))
for (int i = 0; i < list.size(); i++) {
final boolean flag = list.remove("test");
if(!flag){
System.out.println("删除成功");
break;
}
}
}
}
但是,当使用索引删除时有时可能会导致最后一个test并没有并删除
- 对下图代码的分析
因为在我们删除对应的元素的时候,我们的集合的后面的元素会向前进行填充,而我们的for循环会自动i++。以至于会错过元素
解决方案是在在删除元素后进行i--即可
public static void removeElement1(ArrayList<String> list){
//(通过remove(int index)
//通过索引获取元素
for (int i = 0; i < list.size(); i++) {
final String s = list.get(i);
//比较equals
if("test".equals(s)){
list.remove(i);
i--;
}
}
}
案例:集合元素筛选
可以在方法中创建对象然后将引用传递出来,或者直接在main中创建集合
package com.domin.OOP;
import com.domin.Student;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
//集合元素筛选
public class ArrayListTraverse {
public static void main(String[] args) {
//1.创建一个集合存储元素
ArrayList<Student>list = new ArrayList<>();
Student s1 = new Student("张三",23,"boy");
Student s2 = new Student("Alex",12,"boy");
Student s3 = new Student("Jean",18,"girl");
Student s4 = new Student("Jack",45,"boy");
Student s5 = new Student("Girl",11,"girl");
Collections.addAll(list,s1,s2,s3,s4,s5);//添加数据
//2.创建集合存储过滤得到的数据
ArrayList<Student>list1 = new ArrayList<>();
filter(list,list1);
//3.遍历过滤得到的数据
for (int i = 0; i < list1.size(); i++) {
System.out.println(list1.get(i));
}
}
//数据过滤
private static void filter(ArrayList<Student> list,ArrayList<Student>list1) {
for (int i = 0; i < list.size(); i++) {
final Student s = list.get(i);
if(s.getAge()<18){//将小于18岁的对象添加到新的集合中
list1.add(s);
}
}
}
}
第二部分:学生管理系统
对学号有唯一性的把控
该代码只是对学生管理系统的大致实现,具体的细节没有做过多测试
package com.domin.OOP.StudentManager;
import com.domin.OOP.StudentManager.domain.Student;
import java.util.ArrayList;
import java.util.Scanner;
//学生管理系统的测试类
public class StudentManagerTest {
//判断学号是否唯一
public static boolean isUniqueSid(ArrayList<Student> list, String sid) {
//遍历集合
for (int i = 0; i < list.size(); i++) {
final String sid1 = list.get(i).getSid();
if (sid1.equals(sid)) {
return true;//学号相等,返回ture
}
}
return false;//遍历到尾不相等
}
//主界面方法
public static void mainView(ArrayList<Student> list) {
while (true) {
System.out.println("-------------------欢迎来到学生管理系统--------------");
System.out.println("1.添加学生");
System.out.println("2.删除学生");
System.out.println("3.修改学生");
System.out.println("4.查看所有学生");
System.out.println("5.退出");
Scanner sc = new Scanner(System.in);
System.out.println("请输入你的选择:");
int choice = sc.nextInt();
switch (choice) {
case 1:
String tmp= null;//临时存储学号
while (true) {
System.out.println("请输入添加学生的学号:");
tmp = sc.next();
if (!(isUniqueSid(list, tmp))) {
break;
}
System.out.println("输入的学号重复,请重新输入!");
}
String sid = tmp;
System.out.println("请输入添加学生的姓名:");
String name = sc.next();
System.out.println("请输入添加学生的年龄:");
int age = sc.nextInt();
System.out.println("请输入添加学生的生日:");
String birthday = sc.next();
//将添加的学生添加到集合中
list.add(new Student(sid, name, age, birthday));
break;
case 2:
System.out.println("请输入要删除学生的索引:");
int index = sc.nextInt();
list.remove(index);
break;
case 3:
System.out.println("修改学生");
//请输入要修改学生的索引
System.out.println("请输入要修改学生的索引:");
int index1 = sc.nextInt();
System.out.println("请输入修改后的学号:");
String sid1 = sc.next();
System.out.println("请输入修改后i姓名:");
String name1 = sc.next();
System.out.println("请输入修改后的年龄:");
int age1 = sc.nextInt();
System.out.println("请输入修改后的生日:");
String birthday1 = sc.next();
list.set(index1,new Student(sid1,name1,age1,birthday1) );
break;
case 4:
//遍历集合
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
break;
case 5:
System.out.println("退出");
System.exit(0);
break;
default:
System.out.println("输入错误");
}
}
}
public static void main(String[] args) {
//创建集合存储学生的数据
ArrayList<Student> list = new ArrayList<>();
mainView(list);
}
}