`
felixour
  • 浏览: 33071 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

Netjava Lesson10 会变的数组——自定义队列

阅读更多

2013.07.28

 

上课内容:自定义队列

 

这节课我们学习自定义队列。首先我们来回顾一下上节课的内容,上节课我们讲的是数组,我们知道了数组的一些优点和缺点,这里我们总结一下:
优点:
1、数组可以快速地通过下标访问自己所需要的数据,访问速度快。
2、数组是引用传递,这里我们在五子棋里就用到了数组常量,地址不允许改变,但可以改变里面的值,非常方便
3、数组存储的是同以数据类型,不会把自己搞乱
4、一个数组可以存储大量数据,起到简化代码的作用

 

缺点:
1、数组的大小一开始就被限定了
2、数组的类型一开始也被限定了,如果想寸其他数据类型的就要新建一个数组

 

通过数组的缺点,我们发现数组的局限性在于其大小被限定,如果开始放的很大会耗费资源,如果开始创建的小的话就有可能不够用。那么如果我们想改变数组大小该怎么办呢?我们今天用自定义队列来实现。
自定义队列当然还是数组,但是可以通过不断新建数组改变队列长度的大小,我们说数组名是地址,那么我们用改变后长度的数组地址赋给原地址就可以了!
比如说:

int[] array = new int[1];
array[0]=1;
int[] array2 = new int[2];
array = array2;

 那么此时array[0]的值为0,且长度为2,这就是数组名指向的是地址的含义。

 

我们下来建立一个字符串队列:

//初始化队列长度
int size;
//初始化队列数组
String[] array;
//添加add方法
public void add(String str){
	//新建一个临时数组,长度为原来队列加一
	String[] temp = new String[size+1];
	//循环把原数组值赋给临时数组
	for(int i = 0;i<size;i++){
		temp[i] = array[i];
	}
	//把要加入的值赋给临时数组
	temp[size] = str;
	//临时数组地址给原数组
	array = temp;
	//队列长度增加1
	size++;
}

 

然后我们可以接着依次定义其他的一些方法,比如在指定位置插入一个字符串,删除指定位置字符串,获取队列大小等……
那么当我想建立一个队列存储我的一个自定义类,就要新建一个来存放整型的队列类,这样显然会很麻烦。为了简化,我们引入了泛型。下面我们介绍一下泛型:
泛型用E表示,这里我们要注意泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。而Object表示所有的类的祖先,所有的类都继承它。那么我们现在就要用泛型来代表这种类,下面是用泛型我具体实现的队列。

定义队列前,我们下创建一个接口:

public interface List<E> {
	public void add(E e);//将指定的元素添加到此列表的尾部。
	public void inner(int index,E element);//将指定的元素插入此列表中的指定位置。
	public E get(int Index);//返回此列表中指定位置上的元素。
	public void set(int index,E element);//用指定的元素替代此列表中指定位置上的元素。
	public void remove(int index);//移除此列表中指定位置上的元素。
	public int size();//返回此列表中的元素数。
	public void clear();//清空队列
}

 

下面我们创建CustomList来实现这个接口:

/**
 * 定义自定义的对象实现类,实现接口List
 * 
 * @author TTH
 * 
 * @param <E>数据类型
 */
public class CustomList<E> implements List<E> {
	// 初始化数组大小
	private int size = 0;
	//定义数组对象
	private Object[] array;

	/**
	 * 构造方法
	 */
	public CustomList() {
		array = new Object[0];
	}

	/**
	 * 构造方法
	 * 
	 * @param length数组长度
	 */
	public CustomList(int length) {
		array = new Object[length];
	}

	/**
	 * 将指定的元素添加到此列表的尾部
	 */
	public void add(E e) {
		//建立临时的数组,长度为原数组加一
		Object[] arraytemp = new Object[array.length + 1];
		//对数组进行循环
		for (int i = 0; i < array.length; i++) {
			//将原数组的值赋给临时数组
			arraytemp[i] = array[i];
		}
		//把新增的值赋给临时数组
		arraytemp[array.length] = e;
		//将临时数组的地址给原数组
		array = arraytemp;
		//数组大小加一
				size++;
	}

	/**
	 * 将指定的元素插入此列表中的指定位置
	 */
	public void inner(int index, E e) {
		//定义临时数组,长度为原数组加一
		Object[] arraytemp = new Object[array.length + 1];
		//对要插入位置前进行循环
		for (int i = 0; i < index; i++) {
			//将要插入位置前的数据给临时数组
			arraytemp[i] = array[i];
		}
		//将要插入的数据赋给临时数组
		arraytemp[index] = e;
		//对插入位置后面进行循环
		for (int i = index; i < array.length; i++) {
			//将要插入后的数据给临时数组
			arraytemp[i + 1] = array[i];
		}
		//将临时数组的地址给原数组
		array = arraytemp;
		//数组大小加一
		size++;
	}

	/**
	 * 返回此列表中指定位置上的元素
	 * 
	 * @param index指定的位置
	 */
	public E get(int index) {
		//判断指定位置是否不在数组范围内
		if (index < 0 || index > size)
			//如果不在范围,返回空
			return null;
		//否则返回该位置的数据类型
		return (E) array[index];
	}

	/**
	 * 用指定的元素替代此列表中指定位置上的元素。
	 */
	public void set(int index, E e) {
		array[index] = e;
	}

	/**
	 * 移除此列表中指定位置上的元素
	 */
	public void remove(int index) {
		Object[] arraytemp = new Object[array.length - 1];
		for (int i = 0; i < index; i++) {
			arraytemp[i] = array[i];
		}
		for (int i = index; i < array.length - 1; i++) {
			arraytemp[i] = array[i + 1];
		}
		array = arraytemp;
		//数组大小减一
				size--;
	}

	/**
	 * 返回此列表中的元素数
	 */
	public int size() {
		return size;
	}

	/**
	 * 清空队列
	 */
	public void clear() {
		//长度为0
		size=0;
		//队列重置
		array = new Object[0];
	}
}

 

分享到:
评论

相关推荐

    java字符串转String数组简单实例

    java字符串转String数组简单实例,简单但很实用

    java 自定义Queue队列

    `Java.jpg`可能是用来辅助理解队列概念的图片,通常会展示队列的结构和操作示意图。在实际编程中,理解数据结构的内部工作原理和选择合适的数据结构是至关重要的。 总的来说,自定义Java的Queue队列需要对数据结构...

    java中两个byte数组实现合并的示例

    在Java编程语言中,有时我们需要将...如果需要进一步处理合并后的数组,如反转或加密,可以分别使用自定义函数或Java内置的加密库。这些操作在处理二进制数据时非常实用,特别是在网络通信、文件操作和安全传输等场景。

    JAVA类与对象及数组习题

    JAVA类与对象及数组习题 JAVA类和对象及数组是JAVA编程语言的基础概念。下面是关于JAVA类和对象及数组的习题,涵盖了构造方法、继承、多重继承、变量声明、数组初始化等方面的知识点。 1. 构造方法的调用方式: ...

    Java基础练习之数组的应用——ATM Demo

    在这个"Java基础练习之数组的应用——ATM Demo"项目中,我们将会深入探讨如何利用数组和方法来实现一个简单的自动取款机(ATM)模拟程序。这个练习旨在帮助初学者巩固Java基础知识,特别是对数组的操作和方法的使用...

    Java数组练习题(带答案).doc

    Java数组是Java编程语言中的基本数据结构之一,用于存储固定数量的同类型元素。了解和熟练掌握数组的使用是学习Java的重要环节。本篇练习题涵盖了数组的基本概念、操作和异常处理,下面是针对题目中涉及知识点的详细...

    Java基础复习day03数组

    Java基础复习day03数组 Java数组是一种数据类型,引用类型,用于存放一组数据的数据结构。数组的定义、创建、访问、长度属性、遍历、常用Arrays类、二维数组、方法递归调用经典案例、变量源码教程等。 一、数组的...

    java实现的 树状数组

    用java实现的树状数组,可以作为一个简单的模版来进行应用,如果有不懂得地方,可以上网查找树状数组的原理

    java代码-使用java解决回文二维数组的源代码

    java代码-使用java解决回文二维数组的源代码 ——学习参考资料:仅用于个人学习使用!

    c sharp ——自定义集合和常用集合.txt

    list的迭代器,判断下一个是否有值并且下移一位的方法,容器接口,Java的map容器,实现比较接口

    Java基础之循环+数组.md

    对于新接触Java的学员来说,Java基础中必学数组和循环结构,这里有分享,想学的朋友可以看看此文章,学习更多Java知识。

    Java数组,Java数组,多线程编程

    Java数组是程序设计中的基本构建块,它允许程序员存储多个相同类型的数据在一个单一的结构中。在Java中,数组是一种对象,它们具有固定的大小,并且一旦创建,就不能更改其长度。数组提供了通过索引来访问其元素的...

    Java SE程序 接口用对象数组实现

    Java SE程序 接口用对象数组实现Java SE程序 接口用对象数组实现Java SE程序 接口用对象数组实现Java SE程序 接口用对象数组实现Java SE程序 接口用对象数组实现Java SE程序 接口用对象数组实现Java SE程序 接口用...

    Java 基本语法(四)——字串和数组

    ### Java基本语法(四)—— 字串和数组 #### 字串(String) 在Java中,`String` 是一种非常重要的数据类型,它代表一系列字符。Java中的字符串是不可变的,这意味着一旦创建了一个字符串对象,其内容就不能更改。...

    java数组与方法数组的定义及使用

    在Java编程语言中,数组是一种特殊的对象,它用于存储同类型的多个数据项。数组的定义、创建和使用是Java编程的基础,而方法数组则引入了更高级的概念,允许我们在一个数组中存储方法引用。让我们深入探讨这两个主题...

    java动态二维数组的实现

    关于java动态二维数组的实现 可以参考下

    java基础——数组及其应用(csdn)————程序.pdf

    Java中的数组是一种基础且重要的数据结构,它允许存储相同类型的数据集合,并且这些数据按照一定的顺序排列。数组的声明和创建是使用Java编程时的常见操作。声明数组变量的语法有两种形式,例如: ```java dataType...

    java——数组.xmind

    一维数组概念:一组连续的存储空间,存储多个相同数据类型的值。数组的创建。数组的组成。数组的遍历。数组的默认值。

    Java版数据结构代码,栈,动态数组,队列,链表,二叉树

    2. **动态数组(Dynamic Array)**:动态数组是一种可变大小的数组,当数组满时,会自动扩容以容纳更多元素。在Java中,ArrayList就是动态数组的一种实现。栈结构中提到动态数组的压栈方法,意味着在数组满时,代码...

    Java第5章 数组 含源代码

    Java集合框架中的`Arrays`类提供了对数组排序的方法,如`Arrays.sort()`,可用于整型、字符型等基本类型的数组,也可通过自定义比较器对对象数组进行排序。 八、数组与集合框架的关系 虽然数组是Java的基础,但集合...

Global site tag (gtag.js) - Google Analytics