?
class="p0">数组队列
?
1.为什么要使用数组队列?
?
数组相当于是一个容器,可以存放多个相同类型的数据。
?
优点:有序性,清晰,可以快速地查找数据;具有连续的存储空间
?
缺点:在定义的时候数组长度已经固定,不可改变。例如在画板存储图形的时候,如果数组长度太小,会造成画了一定的图形之后,没有存储空间。如果数组长度太大,会造成存储空间的浪费。
?
2.数组队列的实现
?
数据类型?[?]?数组名?=?new?数据类型?[数组长度]
?
对象名中存储什么?对象在内存中的首地址。
?
数组名中存储什么?数组对象在内存中的首地址。
?
数组队列是通过改变数组的首地址来改变数组的长度和内容
?
3.数组队列实现步骤
?
1.定义一个接口,在接口中定义需要实现的抽象方法
?
2.定义一个类来实现接口,重写接口中的方法
?
3.实现方法
?
4.注意事项
?
1.首先要注意的是在实现抽象方法,比如移除、添加等方法的时候,注意数组队列长度的变化
?
2.一定要让原数组指向暂时存储数据的数组
?
?
//主函数 public class Manager { public static void main(String[] args) { System.out.println("开始测试"); MyList ml1 = new MyListImpl(); MyList ml2 = new MyListImpl(); for (int i = 0; i < 3; i++) { ml2.add(new Student("m2学生" + i, i)); System.out.println("m2学生" + i + "学号" + i); } // System.out.println("这是ml1"); for (int i = 0; i < 2; i++) { ml1.add(new Student("学生" + i, i)); System.out.println("学生" + i + "学号" + i); } Student stu = new Student("学生1", 1); // 添加新元素 ml1.add(stu); System.out.println("给ml1加上stu"); for (int i = 0; i < ml1.size(); i++) { Student student = ml1.get(i); System.out.println("学生是" + student.getName()); } // 在指定位置添加一个新元素 ml1.add(1, stu); System.out.println("给ml1在指定位置1添加一个新元素加上stu"); for (int i = 0; i < ml1.size(); i++) { Student student = ml1.get(i); System.out.println("学生是" + student.getName()); } // 将数组队列ml2中的数据添加到当前数组队列的末尾 ml1.add(ml2); System.out.println("将数组队列ml2中的数据添加到当前数组队列的末尾"); for (int i = 0; i < ml1.size(); i++) { Student student = ml1.get(i); System.out.println("学生是" + student.getName()); } // 在指定位置2将参数数组队列ml2中的元素添加到该位置 ml1.add(2, ml2); System.out.println("在指定位置2将参数数组队列ml2中的元素添加到该位置"); for (int i = 0; i < ml1.size(); i++) { Student student = ml1.get(i); System.out.println("学生是" + student.getName()); } // 移除指定索引位置的元素 ml1.remove(2); System.out.println("移除指定索引位置2的元素"); for (int i = 0; i < ml1.size(); i++) { Student student = ml1.get(i); System.out.println("学生是" + student.getName()); } // 移除指定的元素对象 ml1.remove(stu); System.out.println("移除指定的元素对象"); for (int i = 0; i < ml1.size(); i++) { Student student = ml1.get(i); System.out.println("学生是" + student.getName()); } // 移除mal数组队列中的元素 ml1.remove(ml2); System.out.println("移除ml2数组队列中的元素"); for (int i = 0; i < ml1.size(); i++) { Student student = ml1.get(i); System.out.println("学生是" + student.getName()); } // 修改指定索引位置1的元素,用stu来代替 ml1.set(1, stu); System.out.println("修改指定索引位置1的元素,用stu来代替"); for (int i = 0; i < ml1.size(); i++) { Student student = ml1.get(i); System.out.println("学生是" + student.getName()); } // 获取指定索引位置的元素 ml1.get(0); System.out.println("获取指定索引位置的元素"); for (int i = 0; i < ml1.size(); i++) { Student student = ml1.get(i); System.out.println("学生是" + student.getName()); } // 返回数组队列中首次出现的指定元素的索引 System.out.println("返回数组队列中首次出现的指定元素的索引" + ml1.indexOf(stu)); // 判断数组队列中是否有元素 System.out.println("判断数组队列中是否有元素" + ml1.isEmpty()); // 返回此列表中最后一次出现的指定元素的索引 System.out.println("返回此列表中最后一次出现的指定元素的索引" + ml1.lastIndexOf(stu)); // 清除数组队列中所有的元素 ml1.clear(); System.out.println("清除数组队列中所有的元素"); } }
?
//接口 public interface MyList { /** * 添加新元素的方法 * @param stu是新元素 */ public void add(Student stu); /** * 在指定位置添加一个新元素 * @param index指定的索引位置 * @param stu要添加的新元素 * @return 返回true表示添加成功,返回false表示添加失败 */ public boolean add(int index ,Student stu); /** * 将数组队列mal中的数据添加到当前数组队列的末尾 * @param mal要被添加的数组队列 */ public void add(MyList mal); /** * 在指定位置将参数数组队列中的元素添加到该位置 * @param index指定的索引位置 * @param mal要被添加的数组队列 * @return 返回true表示添加成功,返回false表示添加失败 */ public boolean add(int index,MyList mal); /** * 移除指定索引位置的元素 * @param index指定的索引位置 * @return 返回被移除的对象,如果返回Null则表示index的索引不存在 */ public Student remove(int index); /** * 移除指定的元素对象 * @param stu要被移除的元素 * @return 返回true表示移除成功,返回false表示移除失败 */ public boolean remove(Student stu); /** * 移除mal数组队列中的元素 * @param mal要被移除的数组队列 * @return 返回true表示移除成功,返回false表示移除失败 */ public boolean remove(MyList mal); /** * 修改指定索引位置的元素,用stu来代替 * @param index指定的索引位置 * @param stu要替换的新元素 * @return 返回被替换的对象,如果返回Null则表示index的索引不存在 */ public Student set(int index,Student stu); /** * 获取指定索引位置的元素 * @param index指定的索引位置 * @return 返回索引位置的对象,如果返回Null则表示index的索引不存在 */ public Student get(int index); /** * 返回数组队列中存储的元素总数 * @return 返回元素总数 */ public int size(); /** * 清除数组队列中所有的元素 */ public void clear(); /** * 返回数组队列中首次出现的指定元素的索引,或如果此数组队列不包含元素,则返回 -1。 * @param stu要查找的元素 * @return 返回元素的索引,如果返回-1表示元素不存在 */ public int indexOf(Student stu); /** * 判断数组队列中是否有元素 * @return 返回true表示没有元素是空的;返回false表示非空 */ public boolean isEmpty(); /** * 返回此列表中最后一次出现的指定元素的索引,或如果此列表不包含索引,则返回 -1。 * @param stu要查找的元素 * @return 返回元素的索引,如果返回-1表示元素不存在 */ public int lastIndexOf(Student stu); }
?
//实现接口的类 public class MyListImpl implements MyList { private Student[] array = new Student[0]; public MyListImpl() { } /** * 添加新元素的方法 * * @param stu是新元素 */ public void add(Student stu) { Student[] temp = new Student[array.length + 1]; for (int i = 0; i < array.length; i++) { temp[i] = array[i]; } temp[array.length] = stu; array = temp; } /** * 在指定位置添加一个新元素 * * @param index指定的索引位置 * @param stu要添加的新元素 * @return 返回true表示添加成功,返回false表示添加失败 */ public boolean add(int index, Student stu) { Student[] temp = new Student[array.length + 1]; if (index < array.length) { for (int i = 0; i < index; i++) { temp[i] = array[i]; } temp[index] = stu; for (int i = index; i < array.length; i++) { temp[i + 1] = array[i]; } array = temp; return true; } else { return false; } } /** * 将数组队列mal中的数据添加到当前数组队列的末尾 * * @param mal要被添加的数组队列 */ public void add(MyList dest) { // 是原长加上目标长 Student[] temp = new Student[array.length + dest.size()]; // copy src for (int i = 0; i < array.length; i++) { temp[i] = array[i]; } for (int i = array.length; i < array.length + dest.size(); i++) { temp[i] = dest.get(i - array.length); } array = temp; } /** * 在指定位置将参数数组队列中的元素添加到该位置 * * @param index指定的索引位置 * @param mal要被添加的数组队列 * @return 返回true表示添加成功,返回false表示添加失败 */ public boolean add(int index, MyList mal) { Student[] temp = new Student[array.length + mal.size()]; if (index < array.length) { for (int i = 0; i < index; i++) { temp[i] = array[i]; } for (int i = index, j = 0; i < array.length + mal.size(); i++, j++) { temp[i] = mal.get(j); } for (int i = index + mal.size(), j = index; i < array.length + mal.size(); j++, i++) { temp[i] = array[j]; } array = temp; return true; } else { return false; } } /** * 移除指定索引位置的元素 * * @param index指定的索引位置 * @return 返回被移除的对象,如果返回Null则表示index的索引不存在 */ public Student remove(int index) { Student[] temp = new Student[array.length - 1]; if (index < array.length) { for (int i = 0; i < index; i++) { temp[i] = array[i]; } for (int i = index; i < array.length - 1; i++) { temp[i] = array[i + 1]; } Student indexdata = array[index]; array = temp; return indexdata; } else { return null; } } /** * 移除指定的元素对象 * * @param stu要被移除的元素 * @return 返回true表示移除成功,返回false表示移除失败 */ public boolean remove(Student stu) { int index = -1; for (int j = 0; j < array.length; j++) { if (array[j].equals(stu)) { index = j; Student[] temp = new Student[array.length - 1]; if (index < array.length) { for (int i = 0; i < index; i++) { temp[i] = array[i]; } for (int i = index + 1; i < array.length; i++) { temp[i - 1] = array[i]; } array = temp; } } } if (index >= 0 && index < array.length) { return true; } else { return false; } } /** * 移除mal数组队列中的元素 * * @param mal要被移除的数组队列 * @return 返回true表示移除成功,返回false表示移除失败 */ public boolean remove(MyList mal) { Student[] temp = new Student[array.length - mal.size()]; int index = -1; for (int i = 0; i < array.length; i++) { if (array[i].equals(mal.get(i))) { index = i; } } for (int j = 0; j < index; j++) { temp[j] = array[j]; } for (int j = index; j < array.length - mal.size(); j++) { temp[j] = array[j + mal.size()]; } array = temp; if (index > 0 && index < array.length) { return true; } else { return false; } } /** * 修改指定索引位置的元素,用stu来代替 * * @param index指定的索引位置 * @param stu要替换的新元素 * @return 返回被替换的对象,如果返回Null则表示index的索引不存在 */ public Student set(int index, Student stu) { Student[] temp = new Student[array.length]; if (index < array.length) { for (int i = 0; i < index; i++) { temp[i] = array[i]; } temp[index] = stu; for (int i = index + 1; i < array.length; i++) { temp[i] = array[i - 1]; } array = temp; return stu; } else { return null; } } /** * 获取指定索引位置的元素 * * @param index指定的索引位置 * @return 返回索引位置的对象,如果返回Null则表示index的索引不存在 */ public Student get(int index) { if (index < array.length) { return array[index]; } else { return null; } } /** * 返回数组队列中存储的元素总数 * * @return 返回元素总数 */ public int size() { return array.length; } /** * 清除数组队列中所有的元素 */ public void clear() { for (int i = 0; i < array.length; i++) { array[i] = null; } } /** * 返回数组队列中首次出现的指定元素的索引,或如果此数组队列不包含元素,则返回 -1。 * * @param stu要查找的元素 * @return 返回元素的索引,如果返回-1表示元素不存在 */ public int indexOf(Student stu) { int index = -1; for (int j = 0; j < array.length; j++) { if (array[j].equals(stu)) { index = j; break; } } return index; } /** * 判断数组队列中是否有元素 * * @return 返回true表示没有元素是空的;返回false表示非空 */ public boolean isEmpty() { if (array.length != 0) { return true; } return false; } /** * 返回此列表中最后一次出现的指定元素的索引,或如果此列表不包含索引,则返回 -1。 * * @param stu要查找的元素 * @return 返回元素的索引,如果返回-1表示元素不存在 */ public int lastIndexOf(Student stu) { int index = -1; for (int j = array.length - 1; j >= 0; j--) { if (array[j].equals(stu)) { index = j; break; } } return index; } }
?
?
?
<!--EndFragment-->