`
felixour
  • 浏览: 33438 次
  • 性别: 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数组自定义排序

    java中数组的自定义排序,种类繁多,简单实现,可自由操控。

    微信开发学习总结(四)——自定义菜单——自定义菜单创建接口——项目源码

    微信开发学习总结(四)——自定义菜单——自定义菜单创建接口——项目源码; 博客:微信开发学习总结(四)——自定义菜单——自定义菜单创建接口; https://blog.csdn.net/qq_29914837/article/details/82928890

    数组实现循环队列

    java数组实现循环队列。包括入队, 出队,输出队列。 队列先入先出。

    java拼接字节数组轻量高效实现Mybytes

    自定义byte数组,可变长度,轻量高效,解决集合存储简单数据的包装问题,自增缓存减少运算,方便多次调用,非线程同步

    java 自定义Queue队列

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

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

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

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

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

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

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

    利用Java进行疫情大数据分析——“Java面向对象程序设计”课程实践教学设计研究.pdf

    利用Java进行疫情大数据分析——“Java面向对象程序设计”课程实践教学设计研究.pdf

    java与旋转二维数组

    java与旋转二维数组 - 领域模型

    java实现的 树状数组

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

    accp5.0java第八章 数组(改)

    在IT行业中,数组是编程语言中最基础且重要的数据结构之一,尤其在Java中,熟练掌握数组的使用至关重要。"accp5.0 java第八章 数组(改)"着重讲解了Java编程中的数组概念及其应用,这是一份经过修订和完善的知识资料...

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

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

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

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

    数组队列学习代码:队列和环形队列

    普通队列 1)将尾指针往后移:rear+1,当front==rear【空】 2)若尾指针rear小于队列的最大下标maxSize-1,则将数据存入rear所指的数中组元素中,否则无法存入数据。rear==maxSize-1[队列满] 环形队列 1)front变量的...

    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 中,数组的元素会被隐式初始化为默认值,例如整数数组的元素将被初始化为 0,布尔数组的元素将被初始化为 false 等。 实例代码 以下是一个使用动态初始化和静态初始化的示例代码: TestD.java(动态初始...

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

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

Global site tag (gtag.js) - Google Analytics