`
cq520
  • 浏览: 164728 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

自定义ArrayList的实现

阅读更多

使用数组来实现自定义ArrayList,除了基本的增删查改等方法之外,还添加了API中所使用到的一些方法,方便大家更好的理解ArrayList的实现,具体实现都有解释,主函数中给出了测试方法,代码如下:

/**
 * 自定义泛型列表
 * @author 陈强
 * @param <E>
 */
public class MyArrayList<E> {
	Object[] data=new Object[0];//初始数组,定义一个对象类型的数组保存数据
	public static void main(String args[]){
		//创建Integer类型的数组列表
		MyArrayList<Integer> my=new MyArrayList<Integer>();
		//添加元素
		for(int i=1;i<=5;i++){
			my.add(i);
		}
		//my.removeFromTo(1, 3);
		my.add(1);
		//my.turnArray();
		//System.out.println("首次出现指定元素的位置是"+my.IndexOf(1));
		System.out.println("最后一次出现指定元素的位置是"+my.LastIndexOf(1));
		System.out.println("队列当前的长度是"+my.size());
		my.print();
		//System.out.println("获取的元素"+my.get(1));
	}
	/**
	 * 打印队列元素的方法
	 */
	public void print(){
		int length=data.length;
		for(int i=0;i<length;i++){
			System.out.print(data[i]+" ");
		}
	}
	/**
	 *	添加元素的方法
	 * @param e
	 */
	public void add(E e){
		int length=data.length;//获取当前数组的长度
		Object[] dest=new Object[length+1];//创建一个新数组
		//先将原数组中的元素都复制过来
		for(int i=0;i<length;i++){
			dest[i]=data[i];
		}
		dest[length]=e;//添加新元素
		data=dest;//用新数组替换原来的数组
	}
	/**
	 * 插入元素的方法
	 * @param index 指定的下标
	 * @param e 插入的元素
	 */
	public void insert(int index,E e){
		int length=data.length;
		Object[] dest=new Object[length+1];
		for(int i=0;i<index;i++){//将索引前的元素先复制过来
			dest[i]=data[i];
		}
		dest[index]=e;//添加新元素到索引位置
		for(int j=index;j<length;j++){//再将后面一部分元素复制过来
			dest[j+1]=data[j];
		}
		data=dest;
	}
	/**
	 * 删除元素的方法
	 * @param index 指定的下标
	 */
	@SuppressWarnings("unchecked")
	public E remove(int index){
		int length=data.length;
		Object[] dest=new Object[length-1];
		for(int i=0;i<index;i++){//将索引前的元素复制过来
			dest[i]=data[i];
		}
		for(int j=index+1;j<length;j++){//跳过索引指定的位置
			dest[j-1]=data[j];
		}
		data=dest;
		return (E)data[index];//得到被移除的元素
	}
	/**
	 * 移除所有元素的方法
	 */
	public void removeAll(){
		Object dest[]=new Object[0];
		data=dest;
	}
	/**
	 * 获取队列的长度
	 */
	public int size(){
		return data.length;
	}
	/**
	 * 获取指定下标的元素
	 */
	@SuppressWarnings("unchecked")
	public E get(int index){
		return (E) data[index];
	}
	/**
	 * 判断队列是否为空
	 */
	public boolean isEmpty(){
		return size()==0;
	}
	/**
	 * 改变指定下标位置的元素的方法
	 * @param index
	 * @param e
	 */
	public void set(int index,E e){
		//方法类似插入的方法
		int length=data.length;
		Object[] dest=new Object[length];
		for(int i=0;i<index;i++){
			dest[i]=data[i];
		}
		dest[index]=e;//改变指定位置的元素
		for(int j=index+1;j<length;j++){
			dest[j]=data[j];
		}
		data=dest;
	}
	/**
	 * 删除从某一个下标位置开始到某一个下标位置结束的中间元素
	 * @param start 开始位置的下标
	 * @param end	结束位置的下标
	 */
	public void removeFromTo(int start,int end){
		int length=data.length;
		Object dest[]=new Object[length-(end-start)-1];
		for(int i=0;i<start;i++){
			dest[i]=data[i];
		}
		for(int j=end+1;j<length;j++){
			dest[j-(end-start)-1]=data[j];
		}
		data=dest;
	}
	/**
	 * 将列表翻转
	 */
	public void turnArray(){
		int length=data.length;
		int j=length-1;
		Object temp;
		for(int i=0;i<length/2;i++){
			temp=data[j];
			data[j]=data[i];
			data[i]=temp;
			j--;
		}
	}
	/**
	 * 搜索列表中首次出现指定元素的位置,如果不存在该元素则返回-1
	 * @param obj
	 */
	public int IndexOf(Object obj){
		int length=data.length;
		for(int i=0;i<length;i++){
			if(data[i]==obj){
				return i;
			}
		}
		return -1;
	}
	/**
	 * 搜索列表中最后一个出现指定元素的位置,如果不存在则返回-1
	 * @param obj 指定元素
	 */
	public int LastIndexOf(Object obj){
		int length=data.length;
		for(int i=length-1;i>=0;i--){
			if(data[i]==obj){
				return i;
			}
		}
		return -1;
	}
}

 

0
3
分享到:
评论
3 楼 lvwenwen 2013-05-05  
得多看看源码
2 楼 cq520 2013-05-04  
beautiful5200 写道
稍微看过JDK源码就知道,第7行代码是个败笔。这个败笔产生的后果在add方法中体现的淋漓尽致!初始容量不要为0,并且,数组扩容时按现有大小的一定倍数扩容,不是一个个扩容。

    很久以前写过的数据结构,那时还没学过API中的ArrayList,也没有看过JDK源码,所有的方法都是看方法名自己想出来的,只是当时还没写博客的习惯,多谢提醒,还是得多看看源码呀
1 楼 beautiful5200 2013-05-04  
稍微看过JDK源码就知道,第7行代码是个败笔。这个败笔产生的后果在add方法中体现的淋漓尽致!初始容量不要为0,并且,数组扩容时按现有大小的一定倍数扩容,不是一个个扩容。

相关推荐

    自定义ArrayList实现

    自己写的ArrayList,请勿喷!

    自定义实现的ArrayList

    自定义实现的ArrayList数据结构,有大量注释以及编写思路,帮助新手用Java语言来实现数据结构

    Java 中模仿源码自定义ArrayList

    主要介绍了Java 中模仿源码自定义ArrayList的相关资料,需要的朋友可以参考下

    Android编程实现使用Intent传输包含自定义类的ArrayList示例

    主要介绍了Android编程实现使用Intent传输包含自定义类的ArrayList,涉及Android对象序列化、反序列化、Intent数据传输等相关操作技巧,需要的朋友可以参考下

    自定义实现的LinkedList

    自定义实现的ArrayList数据结构,有大量注释以及编写思路,帮助新手用Java语言来实现数据结构

    Java针对ArrayList自定义排序的2种实现方法

    主要介绍了Java针对ArrayList自定义排序的2种实现方法,结合实例形式总结分析了Java操作ArrayList自定义排序的原理与相关实现技巧,需要的朋友可以参考下

    对ArrayList里装载的对象进行自定义排序(任意对象、任何字段、任何规则) !

    对ArrayList里装载的对象进行自定义排序(任意对象、任何字段、任何规则) ! ArrayList中可装载任何对象,并以指定的该对象的字段对该集合中的对象进行指定形式的排序(正序、反序)。 任何类通用........

    1.MyArrayList(ArrayList底层实现).md

    ArrayList. 底层用数组实现, 自己编写的MyArrayList,初始长度10,扩容2倍.

    用自定的ArrayList实现队列

    队列的核心为先进先出,即先入队的元素先出队,在之前手写的ArrayList中添加了删除方法实现了队列 /** * 在之前自定义的动态数组基础上完成队列,动态数组中要添加删除方法 * * @author 大刘 */ public class ...

    Android自定义View实现弹幕效果

    2、自定义view继承view,使用ArrayList保存每条Textitem 3、随机生成坐标点绘制每条TextItem,不断变换Text的横坐标实现弹幕的滚动 首先创建弹幕类,弹幕包括坐标,颜色,滚动速度,以及文字内容: public class ...

    Android 自定义折线图

    数据源中,dataitem中的数量要一致。 @Override protected float marginLengthSetting() { return 20*density;...//所有线条的颜色数组 点的颜色放在数据源中 该数组中顺序要与数据源ArrayList的顺序一致

    自定义GridView并且实现拖拽(附源码)

    方法和上一篇自定义ListView实现拖拽ListItem项交换位置一个原理。只是在交换位置上记录了X轴的相关坐标,计算了X轴的相关变量。实现效果图如下 说明: 本篇给出实现代码,但是不做任何说明。如需了解请看上一篇blog...

    PHP实现C#山寨ArrayList的方法

    主要介绍了PHP实现C#山寨ArrayList的方法,通过一个php自定义类模拟实现C#中ArrayList的功能,具有一定参考借鉴价值,需要的朋友可以参考下

    android自定义组件实现仪表计数盘

    一款颜色,文字弧度大小,仪表角度都可以自定义的组件 项目集成:MeterView 项目目录——&gt;build.gradle allprojects { repositories { ... maven { url 'https://jitpack.io' } } } app——&gt;build.gradle ...

    java JEP自定义字符串公式

    该功能可以实现输入条件和参数,返回true和false 还可以实现输入条件,和参数,计算出结果 ...List&lt;Info&gt; infos = new ArrayList(); infos.add(new Info("v,"ceil(v/100)*10000")); //条件和公式 具体可以看dome

    MyArrayList.java

    使用Java自定义实现ArrayList,增加、删除、查询等。

    Android自定义控件实现支付宝记账饼图

    import java.util.ArrayList; import java.util.List; import android.animation.Animator; import android.animation.ValueAnimator; import android.annotation.TargetApi; import android.content.Context; imp

    android自定义view实现推箱子小游戏

    本文实例为大家分享了android推箱子游戏的具体实现代码,供大家参考,具体内容如下 自定义view: package com.jisai.materialdesigndemo.tuixiangzhi; import android.content.Context; import android.graphics...

    jsp通过自定义标签库实现数据列表显示的方法

    本文实例讲述了jsp通过自定义标签库实现数据列表显示的方法。分享给大家供大家参考,具体如下: 1. 定义标签库类 UserListTag.java package com.yanek.cms.tag; import java.io.IOException; import java.util....

Global site tag (gtag.js) - Google Analytics