数组和队列
数组是将一系列相同类型的数据的按一定的顺序组织在一起的特殊的对象。在Java中,当定义一个数组时,内存
就为其分配固定的空间,故在使用数组时一定要注意不能越界,且数组的索引是从0开始到数组的长度减1。数组有
一维的、二维的,还有多维的。数组的排序有多种方法,比如冒泡、希尔、选择、插入等。
一维数组定义的格式是:
第一种是:数据类型 [] 数组名 = new 数据类型[数组长度];
第二种是:数据类型 [] 数组名 = {数值,...};
第三种是:数据类型 [] 数组名 = new 数据类型[]{数值,...};
二维、多维数组定义的格式与一维数组定义的格式类似。
由于java内存空间中为数组分配的内存是固定的,是不可以在已经创建好的数组中追加一个元素,也不能删除数组
中的某一个元素后将该元素后边的元素往前移一位再释放不必要的内存的。为了解决类似于此类的问题,Java中引入
了自定义队列。自定义队列一般使用来存放数据,而它可以使用数组来存放的,只不过在该自定义队列中,此数组
它是变化(实际上是该数组名指向的地址在变)。在自定义队列中,可以实现向队列末尾追加数据,删除队列中指定
位置的数据,返回队列中数据的个数,向队列中指定位置添加数据,删除队列中指定内容的数据,将一个队列追加到
另一个队列的末尾,返回指定索引位的数据。有时候,我们想定义了一个自定义队列,该队列能适用于存放多种数据
类型时,我们可以定义一个队列泛型。以下是一个简单的自定义队列:
// 定义一个数组
private Student[] stuList;
/**
* 定义一个默认的构造函数
*/
public ZDList() {
stuList = new Student[0];
}
/**
* 定一个向队列的指定位置添加一个数据的方法
* @param stu:要被添加的数据
*/
public void addi(int index , Student stu) {
// 扩充数组的大小,要创建一个新的数组,时原始数组的长度减1
Student[] tempList = new Student[stuList.length +1];
// 遍历将原始数组的内容放入到新数组中
for (int i = 0; i < index; i++) {
tempList[i] = stuList[i];
}
// 遍历将原始数组的内容放入到新数组中
for (int i = index+1; i < tempList.length; i++) {
tempList[i] = stuList[i-1];
}
// 将要添加的数据追加到新数组的指定位置
tempList[index] = stu ;
// 将新数组的地址赋给原始数组。
stuList = tempList;
}
/**
* 定一个向队列删除指定数据的方法
* @param stu:要被删除的数据
*/
public void removei(Student stu1) {
int count = 0 ;
int index = 0 ;
int k ;
// 遍历将原始数组的内容找出stu1的个数
for (int i = 0; i < stuList.length; i++) {
if(stuList[i].getName() == stu1.getName())count = count + 1;
}
System.out.print("count"+count);
// 扩充数组的大小,要创建一个新的数组,时原始数组的长度count
Student[] tempList = new Student[stuList.length - count];
// 遍历将原始数组的内容放入到新数组中
for (int j = 0; j < tempList.length; j++) {
for( k = index; ; ) {
if(k > stuList.length) break ;
if(stuList[k].getName()stu1.getName()) {
tempList[j] = stuList[k] ;
k++;
break ;
} else {k++ ;
continue;
}
}
index =k ;
}
// 将新数组的地址赋给原始数组。
stuList = tempList;
}
/**
* 将一个队列追加到另一个队列的末尾
*/
public void addList(ZDList zdLists){
int a = zdLists.size();
//创建一个新数组
Student [] tempList = new Student[a+stuList.length];
for(int i = 0 ; i < stuList.length ; i++){
tempList[i] = stuList[i];
}
for(int i = stuList.length ; i < tempList.length ; i++){
tempList[i] = zdLists.get(i-stuList.length);
}
// 将新数组的地址赋给原始数组。
stuList = tempList;
}
}
泛型
public class Zdlist<E> {
//定义一个数组
private Object [] array ;
/**
* 定义一个构造函数
*/
public Zdlist(){
array = new Object[0];
}
/**
* 向队列中添加元素
* @param graph
*/
public void add(E chess){
//创建一个新的数组,该数组的长度比属性数组长1
Object [] temp = new Object[array.length+1];
//将属性数组的元素存到新数组中去
for(int i = 0; i < array.length; i++){
temp[i] = array[i];
}
//将追加的元素添加到新数组中去
temp[array.length] = chess ;
//将新数组的地址赋给属性数组
array = temp ;
}
/**
* 获取指定索引位置的元素
*/
public E get(int index){
return (E)array[index];
}
/**
* 获取队列的大小
*/
public int size(){
return array.length;
}
}
二维数组的排序
public void maopao(int [][] array){
//遍历二维数组的行
for(int i=0;i<array.length;i++){
//遍历二维数组的列
for(int k=0;k<array[i].length;k++){
//从k+1位开始冒泡循环
for(int j=k+1;j<array[i].length;j++){
//判断大小
if(array[i][k] > array[i][j]){
//定义一个中间变量
int temp = array[i][k];
array[i][k] = array[i][j];
array[i][j] = temp;
}
}
}
}
//遍历二维数组的行
for(int i=0;i<array.length;i++){
//遍历二维数组的列
for(int k=0;k<array[i].length;k++){
for(int m=i+1;m<array.length;m++){
//从k+1位开始冒泡循环
for(int j=0;j<array[m].length;j++){
//判断大小
if(array[i][k] > array[m][j]){
//定义一个中间变量
int temp = array[i][k];
array[i][k] = array[m][j];
array[m][j] = temp;
}
}
}
}
}
}
}