千锋逆战班学习日志


千锋逆战班学习第37天
努力或许没有收获,但不努力一定没收获,加油。
今天我完善了Java课程的综合案例。
中国加油!!!武汉加油!!!千锋加油!!!我自己加油!!!

综合案例

在这里插入图片描述

com.qf.project.entity.Student

package com.qf.project.entity;

import java.io.Serializable;

public class Student implements Serializable{
	private int id;
	private String name;
	private int age;
	private char gender;
	private String className;
	private double javaScore;//成绩
	private double htmlScore;
	private double springScore;//成绩
	private double totalScore;//总分
	//private static int count = 0;
	public static int count = 0;//扩展、属性不私有
	//无参
	public Student() {}
	//无成绩有参	基本信息
	public Student(String name, int age, char gender, String className) {
		super();
		count++;
		this.id = count;
		this.name = name;
		this.age = age;
		this.gender = gender;
		this.className = className;
	}
	//有成绩有参构造
	public Student(String name, int age, char gender, String className, double javaScore, double htmlScore,
			double springScore) {
		this(name,age,gender,className);
		this.javaScore = javaScore;
		this.htmlScore = htmlScore;
		this.springScore = springScore;
		//总分不用传递,由三课成绩决定总分
		this.totalScore = javaScore + htmlScore + springScore;
	}
	public int getId() {
		return id;
	}
	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 char getGender() {
		return gender;
	}
	public void setGender(char gender) {
		this.gender = gender;
	}
	public String getClassName() {
		return className;
	}
	public void setClassName(String className) {
		this.className = className;
	}
	public double getJavaScore() {
		return javaScore;
	}
	public void setJavaScore(double javaScore) {
		this.totalScore -= javaScore;//先把原来的java成绩减掉。
		this.javaScore = javaScore;//正常赋值
		this.totalScore += this.javaScore;//加上新成绩
	}
	public double getHtmlScore() {
		return htmlScore;
	}
	public void setHtmlScore(double htmlScore) {
		this.totalScore -= htmlScore;
		this.htmlScore = htmlScore;
		this.totalScore += htmlScore;
	}
	public double getSpringScore() {
		return springScore;
	}
	public void setSpringScore(double springScore) {
		this.totalScore -= springScore;
		this.springScore = springScore;
		this.totalScore += springScore;
	}
	public double getTotalScore() {
		return totalScore;
	}
	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + ", age=" + age + ", gender=" + gender + ", className="
				+ className + ", javaScore=" + javaScore + ", htmlScore=" + htmlScore + ", springScore=" + springScore
				+ ", totalScore=" + totalScore + "]";
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((className == null) ? 0 : className.hashCode());
		result = prime * result + gender;
		long temp;
		temp = Double.doubleToLongBits(htmlScore);
		result = prime * result + (int) (temp ^ (temp >>> 32));
		result = prime * result + id;
		temp = Double.doubleToLongBits(javaScore);
		result = prime * result + (int) (temp ^ (temp >>> 32));
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		temp = Double.doubleToLongBits(springScore);
		result = prime * result + (int) (temp ^ (temp >>> 32));
		temp = Double.doubleToLongBits(totalScore);
		result = prime * result + (int) (temp ^ (temp >>> 32));
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj) {
			return true;
		}
		if (obj == null) {
			return false;
		}
		if (getClass() != obj.getClass()) {
			return false;
		}
		Student o = (Student) obj;
		if (this.id == o.getId() && this.name.equals(o.getName()) && this.age == o.getAge() 
				&& this.gender == o.getGender() && this.className.equals(o.getClassName()) 
				&& this.javaScore == o.getJavaScore() && this.htmlScore == o.getHtmlScore()
				&& this.springScore == o.getSpringScore()) {
			return true;
		}
		return false;
	}
	
}

com.qf.project.manager.StudentManager

package com.qf.project.manager;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import com.qf.project.entity.Student;
import com.qf.project.util.MyComparator;
import com.qf.project.util.MyFilter;
import com.qf.project.util.impl.MyArrayList;

/**
 * 完成所有学生管理系统的相关功能
 * 逻辑代码、输入数据
 * 只负责接受前端数据、调用后端
 * */
public class StudentManager {
	//只负责接受前端数据、调用后端
	/**
	 * 使用自定义MyArrayList,存储学生对象
	 * */
	private MyArrayList<Student> allStudent = null;
	public StudentManager() {
		allStudent = new MyArrayList<Student>();
		load();
	}
	/**
	 * 传入初始容量,创建集合对象
	 * @param initCapacity 要求传入的容量大于0并且小于Integer.MAX_VALUE -8
	 * */
	public StudentManager(int initCapacity) {
		allStudent = new MyArrayList<Student>(initCapacity);
		load();
	}
	
	public void load() {
		try {
			File file = new File("Files\\Student.txt");
			if(file.exists()) {
				if(file.length() > 0) {
					//字节输入流
					FileInputStream fis = new FileInputStream(file);
					//对象输入流
					ObjectInputStream ois = new ObjectInputStream(fis);
					Object obj;
					Student stu = new Student();
					while(true) {
						try {
							obj = ois.readObject();
							Student stu2 = (Student)obj;
							Student.count = stu.count > stu2.count ? stu.getId() : stu2.getId();
						} catch (Exception e) {
							break;
						}
						allStudent.add((Student)obj);	
					}
					System.out.println("初始化完毕,有" + allStudent.size() + "名学员信息");
					ois.close();
					fis.close();
				}
			}else {
				file.createNewFile();//文件不存在,新建一个空文件
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void saveByStream() {
		try {
			FileOutputStream fos = new FileOutputStream("Files\\Student.txt",false);
			ObjectOutputStream oos = new ObjectOutputStream(fos);
			
			for (int i = 0; i < allStudent.size(); i++) {
				Student stu = allStudent.get(i);
				oos.writeObject(stu);
			}
			oos.flush();
			oos.close();
			fos.close();
		}catch (Exception e) {
			// TODO: handle exception
		}
	}
	
	/**
	 * 添加学生对象的方法,采用尾插法,插入到集合的末端
	 * @param stu Student
	 * @return 成功返回ture ,失败返回false
	 * */
	public boolean add(Student stu) {
		if(stu == null) {
			System.out.println("不能存入空值");
			return false;
		}
		allStudent.add(stu);
		return true;
	}
	/**
	 * 根据学生唯一Id,删除指定的学生
	 * @param studentId	学生编号
	 * @return 成功返回删除的学生对象,,失败返回null
	 * */
	public Student remove(int id) {
		//1.检查id在集合的位置
		int index = findIndexById(id);
		try {
			return allStudent.remove(index);
		} catch (ArrayIndexOutOfBoundsException e) {
			System.out.println(e.getMessage());
		}
		return null;
	}
	/**
	 * 修改方法,根据学生唯一Id,修改指定的学生
	 * @param studentId	学生编号
	 * @return 成功返回ture ,失败返回false
	 * */
	public boolean modify(int studentId) {
		return false;
	}
	/**
	 * 查单个
	 * 根据学生唯一Id,查询指定的学生
	 * @param studentId	学生编号
	 * @return 成功返回查询的学生对象,,失败返回null
	 * */
	public Student get(int studentId) {
		//1.判断下标数值正确
		int index = findIndexById(studentId);
		//2.获得学员对象返回给StudentService
		if(index > 0) {
			return allStudent.get(index);
		}
		return null;
	}
	/**
	  * 根据学生唯一Id,查询指定的学生的下标
	 * @param studentId	学生编号
	 * @return 成功返回大于0的数字,没找到,返回-1
	 */
	private int findIndexById(int studentId) {
		int index = -1;
		//从下标0开始,遍历集合
		for (int i = 0; i < allStudent.size(); i++) {
			//依次获取当前学生对象的id和传入的studentId做比较
			if(allStudent.get(i).getId() == studentId) {
				index = i;//把存在的学生下标,赋给index
			}
		}
		return index;
	}
	/**
	 * 查询所有,直接遍历集合
	 */
	public void get() {
		//打印所有学生信息
		for (int i = 0 ;i < allStudent.size() ;i++) {
			System.out.println(allStudent.get(i));
		}
	}
	/**
	 * 根据班级名称查询学生信息
	 * @param className	班级名称
	 * */
	public void get(String className) {
		//打印所有学生信息
		for (int i = 0 ;i < allStudent.size() ;i++) {
			if(allStudent.get(i).getClassName().equalsIgnoreCase(className)) {
				System.out.println(allStudent.get(i));
			}
		}
	}
	
	/**
	 * 根据姓氏查询学生信息
	 * @param surname	姓氏
	 * */
	public void getSurname(String surname) {
		//打印所有学生信息
		for (int i = 0 ;i < allStudent.size() ;i++) {
			if(allStudent.get(i).getName().startsWith(surname)) {
				System.out.println(allStudent.get(i));
			}
		}
	}
	
	/**
	 * 根据名字查询学生信息
	 * @param lastname	名字
	 * */
	public void getLastname(String lastname) {
		for (int i = 0 ;i < allStudent.size() ;i++) {
			if(allStudent.get(i).getName().contains(lastname)) {
				System.out.println(allStudent.get(i));
			}
		}
	}
	//过滤
	
	//排序
	/**
	 * 根据id排序
	 * 
	public void sortId() {
		//1.排序不允许在原数组中进行,创建一个新数组,复制一份
		Object[] sortTemp = allStudent.toArray();
		
		//2.选择排序
		for (int i = 0; i < sortTemp.length - 1; i++) {
			for (int j = i+1; j < sortTemp.length; j++) {
				if(((Student)sortTemp[i]).getId() < ((Student)sortTemp[j]).getId()) {
					Student temp = (Student)sortTemp[i];
					sortTemp[i] = sortTemp[j];
					sortTemp[j] = temp;
				}
			}
			for (Object obj : sortTemp) {
				System.out.println(obj);
			}
		}
		
	}
	*/
	
	
	 /** 
	  * 根据传来的规则排序
	  */
	public void sort(MyComparator<Student> com) {
		//1.排序不允许在原数组中进行,创建一个新数组,复制一份
		Object[] sortTemp = allStudent.toArray();		
		//2.选择排序
		for (int i = 0; i < sortTemp.length - 1; i++) {
			for (int j = i+1; j < sortTemp.length; j++) {
				if(com.compare((Student)sortTemp[i], (Student)sortTemp[j]) < 0) {
					Student temp = (Student)sortTemp[i];
					sortTemp[i] = sortTemp[j];
					sortTemp[j] = temp;
				}
			}
		}
		for (Object obj : sortTemp) {
			System.out.println(obj);
		}
	}
	
	public void showStuFilter(MyFilter<Student> filter) {
		for (int i = 0; i < allStudent.size(); i++) {
			if(filter.accept(allStudent.get(i))) {
				System.out.println(allStudent.get(i));
			}
		}
	}
	
	
}

com.qf.project.menu.SystemMain

package com.qf.project.menu;

import java.util.Scanner;

import com.qf.project.entity.Student;
import com.qf.project.service.StudentService;

/**
 *\只有菜单 
 * 1.查看 
 * 2.修改 
 * 3.添加 
 * 4.删
*/
public class SystemMain {
	static Scanner sc = new Scanner(System.in);
	public static void main(String[] args) {
		StudentService ss = new StudentService();
		int choice = 0;
		/**
		for(int i = 0;i<10;i++) {
			String name = "吴彦祖"+i;
			int age = (int)(Math.random() *50);
			char sex = '男';
			String className = "NZ2002";
			double javaScore = (double)(Math.random() *100);
			double htmlScore = (double)(Math.random() *100);
			double springScore = (double)(Math.random() *100);
			ss.addStudent(new Student(name,age,sex,className,javaScore,htmlScore,springScore));
		}
		*/
		do{
			System.out.println("1.查看所有学员");
			System.out.println("2.新增学员");
			System.out.println("3.查询指定ID的学生信息");
			System.out.println("4.根据ID删除学生信息");
			System.out.println("5.根据ID修改学生信息");
			System.out.println("6.根据班级名称查询学生信息");
			System.out.println("7.根据姓名(姓/名)查询学员");
			System.out.println("8.根据需求排序学生信息");
			System.out.println("9.根据需求展示符合条件的学生信息");
			System.out.println("0.退出");
			choice = sc.nextInt();
			switch (choice) {
				case 1:
					//查看所有
					ss.show();
					break;
				case 2:
					//新增学员
					ss.addStudent();
					break;
				case 3:
					//查询指定ID的学生信息
					ss.getStuById();
					break;
				case 4:
					//根据ID删除学生信息"
					ss.deleteStuById();
					break;
				case 5:
					//根据ID修改学生信息
					ss.updataStuById();
					break;
				case 6:
					//根据班级名称查询学生信息
					ss.getStudentByClassName();
					break;
				case 7:
					//根据姓名(姓/名)查询学员
					ss.getStudentByLike();
					break;
				case 8:
					//根据需求排序学生信息
					ss.sortStu();
					break;
				case 9:
					//
					ss.showFilter();
					break;
				case 0:
					//退出
					ss.saveStuForFile();
					return;
				default:
					break;
			}
		}while(choice != 0); 
	}
}

com.qf.project.service.StudentService

package com.qf.project.service;

import java.util.Scanner;

import com.qf.project.entity.Student;
import com.qf.project.manager.StudentManager;

public class StudentService {
	Scanner sc = new Scanner(System.in);
	StudentManager stm = new StudentManager();
	/**
	 * 展示所有学生
	 * */
	public void show() {
		stm.get();
	}
	/**
	 * 添加学生对象的方法
	 * 该方法让用户输入数据,并判断数据
	 * */
	public void addStudent() {
		System.out.println("请按照顺序输入正确学员信息");
		System.out.println("请输入学员姓名");
		String name = sc.next();
		System.out.println("请输入学员年龄");
		int age = sc.nextInt();
		System.out.println("请输入学员(性别男/女)");
		char sex = sc.next().charAt(0);
		System.out.println("请输入学员班级名称");
		String className = sc.next();
		System.out.println("请输入学员Java考试成绩(若没有,填零)");
		double javaScore =sc.nextDouble();
		System.out.println("请输入学员HTML考试成绩(若没有,填零)");
		double HTMLScore =sc.nextDouble();
		System.out.println("请输入学员Spring考试成绩(若没有,填零)");
		double SpringScore =sc.nextDouble();
		//封装成对象
		Student stu = new Student(name,age,sex,className,javaScore,HTMLScore,SpringScore);
		//调用StudentManager里的方法
		boolean result = stm.add(stu);
		if(result == true) {
			System.out.println("新增成功");
		}else {
			System.out.println("新增失败");
		}
	}
	public void addStudent(Student stu) {
		stm.add(stu);
	}
	/**
	 * 查询指定ID的学生信息
	 * 该方法让用户输入ID,并打印学生信息,若没有,打印学员不存在
	 * */
	public void getStuById() {
		//1.判断输入是否正确
		/**
		int id = 0;
		do {
			System.out.println("请输入学员的ID");
			id = sc.nextInt();
			if(id <= 0) {
				System.out.println("ID应大于0");
			}
		} while (id <= 0);
		*/
		//获取ID
		Student stu = stm.get(IDcheck());
		if(stu != null) {
			System.out.println(stu);
		}else {
			System.out.println("学员不存在");
		}
	}
	/**
	 * 删除指定ID的学生信息
	 * 该方法让用户输入ID,并打印删除成功,若没有,打印删除失败
	 * */
	public void deleteStuById() {
		/**
		int id = 0;
		do {
			System.out.println("请输入要删除的学生Id");
			id = sc.nextInt();
			if(id <= 0) {
				System.out.println("ID应大于0");
			}
		} while (id <= 0);
		*/
		Student stu = stm.remove(IDcheck());
		if(stu != null) {
			System.out.println("删除成功");
		}else {
			System.out.println("删除失败");
		}
	}
	/**
	 * 修改指定ID的学生信息
	 * 该方法让用户输入ID,并修改指定ID的学生信息信息。
	 * */
	public void updataStuById() {
		/**
		int id = 0;
		do {
			System.out.println("请输入修改信息的学生Id");
			id = sc.nextInt();
			if(id <= 0) {
				System.out.println("ID应大于0");
			}
		} while (id <= 0);
		*/
		Student stu = stm.get(IDcheck());
		if(stu != null) {
			System.out.println("现在要修改"+stu.getName()+"的信息:");
			System.out.println("学生ID:"+stu.getId());
			System.out.println("学生姓名:"+stu.getName());
			System.out.println("学生年龄:"+stu.getAge());
			System.out.println("学生性别:"+stu.getGender());
			System.out.println("学生班级:"+stu.getClassName());
			System.out.println("Java:"+stu.getJavaScore());
			System.out.println("HTML:"+stu.getHtmlScore());
			System.out.println("Spring:"+stu.getSpringScore());
			System.out.println("-------------------------------------");
			int choice = 0;
			while(true) {
				System.out.println("1.修改学生姓名");
				System.out.println("2.修改性别");
				System.out.println("3.修改班级名称");
				System.out.println("4.修改学生年龄");
				System.out.println("5.修改Java成绩");
				System.out.println("6.修改HTML成绩");
				System.out.println("7.修改Spring成绩");
				System.out.println("8.退出,并保存");
				choice = sc.nextInt();
				switch(choice) {
				case 1:
					System.out.println("请输入学生的新姓名:");
					String name = sc.next();
					stu.setName(name);
					break;
				case 2:
					System.out.println("请输入学生的性别(男  or 女):");
					char gender = sc.next().charAt(0);
					stu.setGender(gender);
					break;
				case 3:
					System.out.println("请输入学生的新班级:");
					String className = sc.next();
					stu.setClassName(className);
					break;
				case 4:
					System.out.println("请输入学生的年龄:");
					int age  = sc.nextInt();
					stu.setAge(age);
					break;
				case 5:
					System.out.println("请输入学生的Java成绩:");
					double javaScore = sc.nextDouble();
					stu.setJavaScore(javaScore);
					break;
				case 6:
					System.out.println("请输入学生的HTML成绩:");
					double htmlScore = sc.nextDouble();
					stu.setHtmlScore(htmlScore);
					break;
				case 7:
					System.out.println("请输入学生的Spring成绩:");
					double springScore = sc.nextDouble();
					stu.setSpringScore(springScore);
					break;
				case 8:
					System.out.println("修改完成,并保存了!");
					System.out.println("修改后的学员信息为:"+stu);
					return;
				default:
						break;
				}
			}
		}else {
			System.out.println("查无此人!请核对学号");
		}
	}
	
	/**
	 * 获取合适的id
	 * @return 返回符合标准的id
	 * */
	private int IDcheck() {
		int id = 0;
		do {
			System.out.println("请输入学员id");
			id = sc.nextInt();
			if(id <= 0) {
				System.out.println("id不能小于等于0");
			}
		} while (id <= 0);
		return id;
	}
	
	/**
	 * 根据班级名称查询学生信息。
	 * */
	public void getStudentByClassName() {
		System.out.println("请输入班级名称");
		String className = sc.next();
		stm.get(className);
	}
	/**
	 * 根据姓名(姓/名)查询学员
	 * */
	public void getStudentByLike() {
		System.out.println("请选择:1.根据姓    2.根据名字    0.退出");
		int choice = 0;
		while(true) {
			choice = sc.nextInt();
			switch (choice) {
			case 1:
				System.out.println("请输入姓氏");
				String surname = sc.next();
				stm.getSurname(surname);
				break;
			case 2:
				System.out.println("请输入姓氏");
				String lastname = sc.next();
				stm.getLastname(lastname);
				break;
			case 0:
				return;	
			default:
				break;
			}
		}
	}
	/**
	 * 根据需求排序学生信息
	 * */
	public void sortStu() {
		//1.升序规则	升序
		//2.升序的方式有多种:id,age,score
		//3.底层排序:冒泡、选择
		int choice = 0;
		while(true){
			System.out.println("将按照升序排列学员信息,请选择条件");
			System.out.println("1.根据id  2. 根据age  3.根据score   0.退出");
			choice = sc.nextInt();
			switch (choice) {
			case 1:
				stm.sort((stu1,stu2)->stu1.getId() - stu2.getId());
				break;
			case 2:
				stm.sort((stu1,stu2)->stu1.getAge() - stu2.getAge());
				break;
			case 3:
				stm.sort((stu1,stu2)->(int)(stu1.getTotalScore() - stu2.getTotalScore()*100));
				/**
				stm.sort(new MyComparator<Student>() {
					@Override
					public int compare(Student stu1, Student stu2) {	
						return (int)(stu1.getTotalScore() - stu2.getTotalScore()*1000);
					}
				});
				*/
				break;
			case 0:
				return;
			default:
				break;
			}
		}
	}
	
	public void showFilter() {
		//1.查询年龄大于15的
		//2.查询总分大于250的
		int choice = 0;
		while(true) {
			System.out.println("1.查询年龄大于15的    2.查询总分大于150的  0.退出 ");
			choice = sc.nextInt();
			switch (choice) {
			case 1:
				stm.showStuFilter((s)->s.getAge() > 15);
				break;
			case 2:
				stm.showStuFilter((s)->s.getTotalScore() > 150);
				break;
			case 0:
				return;
			default:
				break;
			}
			
		}
	}
	
	
	public void saveStuForFile() {
		System.out.println("请稍后,正在更新最近学生信息");
		stm.saveByStream();
	}
}

com.qf.project.util.MyComparator

package com.qf.project.util;

public interface MyComparator<E> {
	
	public int compare(E stu1 , E stu2);
}

com.qf.project.util.MyFilter

package com.qf.project.util;

public interface MyFilter<E> {
	public boolean accept(E e);
}

com.qf.project.util.MyList

package com.qf.project.util;
/**
 * 增加:
 * add(E e);
 * add(int index,E e);
 * 删除:
 * remove(E e);
 * remove(int index);
 * 改:
 * set(int index,E e);
 * 获取:
 * int size();
 * Object[] toArray();
 * boolean isEmpty();
 * boolean contains(Object o);
 * MyArrayList<E> subList(int start,int end);
 * int indexOf(Object o);
 * int lastIndexOf(Object o);
 * E get(int index);
 * @author GQ
 *
 * @param <E>  泛型 应用在不同类型下,作为集合
 */
public interface MyList<E> {
	/**
	 * 添加方法,添加元素到集合末尾
	 * @param e泛型
	 * @return true成功    false失败
	 */
	boolean add(E e);
	/**
	 * 添加方法,指定下标位置进行添加
	 * @param index 指定的下标位置
	 * @param e 元素 泛型
	 * @return true成功  false失败
	 */
	boolean add(int index,E e);
	/**
	 * 移除方法,指定移除的元素
	 * @param o 元素
	 * @return 移除的元素
	 */
	E remove(Object o);
	/**
	 * 移除方法,指定移除的下标
	 * @param index 指定的下标
	 * @return 移除的元素
	 */
	E remove(int index);
	/**
	 * 覆盖方法,替换指定下标的元素
	 * @param index 下标
	 * @param e 替换的元素
	 * @return 被替换的元素
	 */
	E set(int index,E e);
	/**
	 * 获取集合中有效元素的个数
	 * @return 有效元素的个数
	 */
	int size();
	/**
	 * 获得当前集合中,所有元素的Object类型的数组
	 * @return Object[] 包含集合中所有的对象
	 */
	Object[] toArray();
	/**
	 * 判断当前集合是否为空
	 * @return 如果一个元素都没有,返回true,有元素返回false
	 */
	boolean isEmpty();
	/**
	 * 判断某个对象o,在集合中是否存在
	 * @param o 需要查找的对象
	 * @return 存在返回true,不存在返回false
	 */
	boolean contains(Object o);
	/**
	 * 根据需求,返回start到end之间的MyList集合的子集合
	 * @param start 要求有效下标的范围,不能超过end
	 * @param end要求有效下标的范围,不能小于等于start
	 * @return 数据符合要求,返回一个当前集合的子集合。若数据不符合要求,返回NULL
	 */
	MyList<E> subList(int start,int end);
	/**
	 * 获得指定元素在集合中第一次出现的位置
	 * @param o 指定的元素
	 * @return 找到返回值 返回下标,没找到返回-1
	 */
	int indexOf(Object o);
	/**
	 * 获取指定元素在集合中最后一次出现的位置
	 * @param o指定的元素
	 * @return 找到返回值 返回下标,没找到返回-1
	 */
	int lastIndexOf(Object o);
	/**
	 * 根据指定的下标位置,获得元素
	 * @param index 下标
	 * @return 元素对象
	 */
	E get(int index);
	
	
}

com.qf.project.util.impl.MyArrayList

package com.qf.project.util.impl;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;

import com.qf.project.util.MyList;

public class MyArrayList<E> implements MyList<E>{
	//1.保存任意类型数据的数组,集合的底层
	private Object[] elementData = null;
	//2.集合的初始容量
	private static final int DEFAULT_CAPACITY = 10;
	//3.保存数组中有效元素个数(下一个元素插入的下标)
	private int size = 0;
	public MyArrayList() {
		//elementData = new Object[DEFAULT_CAPACITY];
		//统一化当前集合页的初始化方式
		this(DEFAULT_CAPACITY);
	}
	/**
	 * 手工初始化集合的容量
	 * @param initCapacity 传入的容量大小:要求传入的容量大于0并且小于Integer.MAX_VALUE -8
	 */
	public MyArrayList(int initCapacity) {
		//判断initCapacity是否符合要求
		if(initCapacity < 0 || initCapacity > Integer.MAX_VALUE - 8) {
			throw new IllegalArgumentException("传递了一个不符合规范的初始容量" + initCapacity);
		}else {
			elementData = new Object[initCapacity];
		}
	}
	
	
	@Override
	public boolean add(E e) {
		//数组是否饱满了
		if(size == elementData.length) {
			//扩容
			grow(size + 1);
		}
		elementData[size] = e;
		size++;
		return true;
	}
	/**
	 * 为底层数组elementData做扩容!
	 * @param minCapacity 扩容需要得最小容量!
	 */
	private void grow(int minCapacity) {
		int oldCapacity = elementData.length;
		int newCapacity = oldCapacity + (oldCapacity >> 1);//要扩容的大小
		
		if(newCapacity > Integer.MAX_VALUE - 8) {
			throw new OutOfMemoryError("集合溢出了!");
		}
		if(newCapacity - minCapacity == 0) {
			newCapacity = minCapacity;
		}
		//1、创建新数组
		//2、拷贝将旧数组到新数组
		//3、返回新数组的首地址
		//4、替换
		elementData  = Arrays.copyOf(elementData, newCapacity);
	}
	
	@Override
	public boolean add(int index, E e) {
		//1. 判断下标是否合理,,不合理,抛异常,程序因异常而终止
		checkIndex(index);
		if(size == elementData.length) {
			grow(size + 1);
		}
		//2.
		for(int i = size;i > index; i--) {
			elementData[i] = elementData[i - 1];
		}
		elementData[index] = e;
		size++;	
		return true;
	}
	/**
	 * 指定下标的安全检查!如果下标值不符合要求,抛异常
	 * @param index  下标
	 */
	private void checkIndex(int index) {
		if(index < 0 || index >= size) {
			throw new ArrayIndexOutOfBoundsException(index);
		}
	}
	
	@Override
	public E remove(Object o) {
		if(o == null) {
			throw new NullPointerException("传递的是空值");
		}
		return this.remove(isCheck((E)o, 0));
	}
	/**
	 * 判断元素是否存在,存在返回位置,不存在返回-1
	 *@param E e
	 * @return 若存在返回所在下标	不存在返回-1
	 */
	private int isCheck(E e,int index) {
		for (int i = index; i < size; i++) {
			if(elementData[i].equals((E)e)) {
				return i;
			}
		}
		return -1;
	}
	
	
	@Override
	public E remove(int index) {
		//1.检查下标
		checkIndex(index);
		//2.获取对应下标的对象
		E removeIndex = this.get(index);
		for (int i = index; i < size - 1; i++) {
			elementData[i] = elementData[i + 1]; 
		}
		elementData[size - 1] = null;//把数组中最后下标置空
		size--;
		return removeIndex;
	}

	@Override
	public E set(int index, E e) {
		checkIndex(index);
		E oldE = (E) elementData[index];
		elementData[index] = e;
		return oldE;
	}

	@Override
	public int size() {
		return size;
	}

	@Override
	public Object[] toArray() {
		return Arrays.copyOf(elementData, size);//通过复制,产生新地址
	}

	@Override
	public boolean isEmpty() {
		if(size == 0) {
			return true;
		}
		return false;
	}

	@Override
	public boolean contains(Object o) {
		for (int i = 0; i < size; i++) {
			if(elementData[i].equals((E)o)) {
				return true;
			}
		}
		return false;
	}

	@Override
	public MyList<E> subList(int start, int end) {
		if(start > end) {
			throw new ArrayIndexOutOfBoundsException(start + "必须小于" + end);
		}
		MyList<E> mylist = null;
		for (int i = start; i <= end; i++) {
			mylist.add(this.get(i));
		}
		return mylist;
	}

	@Override
	public int indexOf(Object o) {
		
		return isCheck((E)o,0);
	}

	@Override
	public int lastIndexOf(Object o) {
		int choice = -1;
		for (int i = 0; i < size; i = choice + 1) {
			choice = isCheck((E)o,i);
		}
		return choice;
	}

	@Override
	public E get(int index) {
		checkIndex(index);//检查下标
		return (E)elementData[index];//返回指定下标的元素
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值