`
yun342173024
  • 浏览: 72894 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

模拟ArrayList

    博客分类:
  • java
 
阅读更多
最近公司没什么项目,闲来无事,写了段代码,模拟下ArrayList,代码如下:
  package com.test;

public class ImitateArrayList<T> {
    //定义一个默认的容器大小
	private static final int DEFAULT_CAPACITY = 16;
	
	//存放数据的数组
	private Object[] elements;
	
	//元素的数量和指向数组的下一个索引
	private int size;  
	
	public ImitateArrayList(){
		this(DEFAULT_CAPACITY);
	}
	
	public ImitateArrayList(int capacity){
		if(capacity < 0){
			throw new IllegalArgumentException("invalid capacity "+ capacity);
		}
		elements = new Object[capacity];
	}
	
	
	/*
	 * 向容器中添加元素
	 */
	public void addElement(T obj){
	    

		if(checkCapacity()){
			ensurceCapacity(); 
		}
		elements[size++] = obj;
	}
	
	
	
	
	


	/*
	 * 增加数组的容量
	 */
   private void ensurceCapacity(){
	   int oldCapacity = elements.length;
	   int newCapacity = oldCapacity * 3 / 2;
	   Object[] oldData = elements;
	   elements = new Object[newCapacity];
	   System.arraycopy(oldData,0,elements,0,size);
   }
	
   /*
    * 返回容器中元素的个数
    */
   public int size(){
	   return size;
   }
   
    @Override
    public String toString() {
     
       StringBuilder stringBuilder = new StringBuilder(100);
       stringBuilder.append("[");
       for(int i = 0; i < size;i++){
    	   
    	   if(i == size - 1){
    		   stringBuilder.append(elements[i].toString());
    	   }else{
    		   stringBuilder.append(elements[i].toString() + ",");  
    	   }
       }
       
       stringBuilder.append("]");
       return  stringBuilder.toString();   
    }
   
    public Object remove(int index){
    	
    	checkIndex(index);  
    	Object oldElement = elements[index];  
    	moveElement(index,Operation.REMOVE);
    	size--;
    	return oldElement;
    	
    }
  
    
    //检验索引
    
    private void checkIndex(int index){
     	if(index >= size || index < 0){
    		throw new IllegalArgumentException("invalid argument "+index);
    	}
    }
     
	//移动元素
    private void moveElement(int index,Operation operation) {
	  	if(operation  == Operation.REMOVE ){
	  		for(int i = index; i < size - 1;i++){
	  	  	  elements[i] = elements[i + 1];  	
	  	  	}
	  	  }else if(operation == Operation.ADD){
	  		for(int i = elements.length - 2; i >= index ;i--){
		  	  	  elements[i + 1] = elements[i];	
		  	  	}
	  	  }
    	
		  
	}
    
    
    //获取数组中的一个元素
    
    public T get(int index){
    	this.checkIndex(index);
    	return (T)elements[index];
    }
    
    //在固定的索引位置插入一个元素
    public void add(int index,T element){
    	
    	//是否要增加容量
    	if(checkCapacity()){
    		ensurceCapacity();
    	}
    	
    	//检查index
        if(index < 0 || index >= elements.length){
        	throw new IllegalArgumentException("invalid index "+ index);
        }
        //如果          
    	if(index >= size){
    		elements[size] = element;
    	}else{
    	  moveElement(index,Operation.ADD);
    	  elements[index] = element;
    	}
       
    	size++;
    }
    
   
    //检验当前的元素个数是否等于容器的容量
    
	
	private boolean checkCapacity() {
		// TODO Auto-generated method stub
		if(size >= elements.length){
			return true; 
		}
		return false;
	}
    
	
   //删除传入的某个元素
	
  public boolean remove(Object obj){
	  boolean isDeleted = false;
	  if(obj == null){
		  isDeleted = true;
	  }else{
		  int index = this.indexOf(obj);
		  remove(index);
		  isDeleted = true;
	  }
	
	  return isDeleted;   
	  
	  
  }

  //得到元素的索引位置
  
  public int indexOf(Object obj){
	  int index = -1;
      for(int i = 0;i < size;i++){
		  if(obj.equals(elements[i])){
			  index = i;
		  }
	  }
	  
      return index;
  
  }
  
  
  
  
}

//iterator的实现
private class IteratorImpl implements Iterator<T>{
    
	private int cursor = 0;
	private int lastRef = -1;
	@Override
	public boolean hasNext() {
		// TODO Auto-generated method stub
		return cursor < size;
	}

	@Override
	public T next() {
		// TODO Auto-generated method stub
		 T next = ImitateArrayList.this.get(cursor);
		lastRef = cursor++;
		return next ;
	}

	@Override
	public void remove() {
		// TODO Auto-generated method stub
		if(lastRef == -1){
			throw new IllegalStateException("before remove you must call next() method");
		}
		ImitateArrayList.this.remove(lastRef);
		if(lastRef < cursor){
			cursor--;
		}
		lastRef = -1;
	}
	  
  }
  
  
  
@Override
public Iterator<T> iterator() {
	// TODO Auto-generated method stub
	return new IteratorImpl();
}






下面是测试代码:

 package com.test;

import static org.junit.Assert.*;

import org.junit.Before;
import org.junit.Test;

public class ImitateArrayListTest {
    
	private ImitateArrayList<Object> imitateArrayList;
	
	@Before
	public void setUp(){
		
		imitateArrayList = new ImitateArrayList<Object>(2);
	}
	
	/*
	 * 测试向顺序存储列表添加元素
	 */
	@Test
	public void testAddElement() {
		
		imitateArrayList.addElement("abc");
		imitateArrayList.addElement("def");
		int actual = imitateArrayList.size();
		assertEquals(2,actual);
	}
    
	/*
	 * 测试超出容量
	 */
	@Test
	public void testExceedInitCapacity(){
		
		imitateArrayList.addElement("abc");
		imitateArrayList.addElement("def");
		imitateArrayList.addElement("jkl");
		imitateArrayList.addElement("kif");
		int actual = imitateArrayList.size();
		assertEquals(4,actual);
	}
	
	/*
	 * 测试toString
	 */
	
	@Test
	public void testToString(){
		
		imitateArrayList.addElement("abc");
		imitateArrayList.addElement("def");
		imitateArrayList.addElement("jkl");
		imitateArrayList.addElement("kif");
		String actual = imitateArrayList.toString();
		
		assertEquals("[abc,def,jkl,kif]",actual);
		
	}
	
	/*
	 * 测试删除一个元素
	 */
	@Test
	public void testRemove(){
		imitateArrayList.addElement("abc");
		imitateArrayList.addElement("def");
	    imitateArrayList.remove(0);
		Object actual = imitateArrayList.get(0);
		assertEquals("def",actual);
		
	}
	
	/*
	 * 测试在指定的索引位置增加一个元素
	 */
	@Test
	public void testAddSpecifyIndex(){
		imitateArrayList.add(0,"abc");
		imitateArrayList.add(0,"def");
		Object actual = imitateArrayList.get(0);
		System.out.print(imitateArrayList.toString());
		assertEquals("def",actual);
	}
	
	/*
	 * 测试在指定的索引位置增加一个元素
	 */
	@Test  
	public void testRemoveByObject(){
		imitateArrayList.add(0,"abc");
		imitateArrayList.add(0,"def");
		boolean actual = imitateArrayList.remove("abc");
		System.out.println(imitateArrayList.get(0));
		assertEquals(true,actual);
	}
	
	
}
   

只写了arrayList的部分功能
分享到:
评论

相关推荐

    模拟arraylist底层实现

    简单模拟java 中的arraylist的底层实现

    用C语言模拟ArrayList

    实现了ArrayList的部分功能,代码有什么问题,欢迎大神指正给予指导意见。

    模拟java ArrayList Iterator

    本资源模拟java ArrayList Iterator的实现方式,其实也是为了介绍一下Iterator的设计模式。

    JS ArrayList

    JS模拟ArrayList JS容器类

    ArrayList 深入理解底层

    ArrayList 集合源码解读介绍构造方法add方法remove方法总结 介绍 ArrayList Jdk1.8采用的是数组的数据结构,是非线程安全的一个集合 (多线程下数据不安全),本文章主要讲解ArrayList集合添加和集合扩容,其他方法...

    JSP_使用_Session_ArrayList_实现购物车程序

    JSP_使用_Session_ArrayList_实现购物车程序

    MyArrayList.java

    自己写一个自定义的类,模拟ArrayList的下述功能, 其中类中包含的方法有: add(加元素),remove(删除元素), indexOf(返回指定元素的索引),clear(清空数组), reverse(数据倒置)。

    PHP实现C#山寨ArrayList的方法

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

    初学java用ArrayList集合做的一个简易库存管理系统

    初学java用ArrayList集合做的一个简易库存管理系统,有添加,删除,修改,查看等功能,用Arraylist集合做的,不是用数据库,对初学者以后学习数据库操作有帮助,两个文件必须放在同一文件夹,Java1文件为源码,spkc...

    Weather代码,模拟这个过程,生成天气数据,然后显示出来

    而我们要做的程序就是模拟这个过程,生成天气数据,然后显示出来。 需求分析: 1、设计一个天气类Weather,用于温度和湿度数据的存放和读取。 2、设计一个线程类GenerateWeather,用于生成天气数据。模拟生成10次...

    KTV点歌系统

    ktv点歌系统,实现ktv点歌系统的各种优化,不过也是刚学练手的一个项目, 还有各种不足的地方还望大家多多指正

    Java 模拟文件管理器

    模拟文件管理器程序,实现控制台对文件和文件夹的管理操作。适合Java初学者,练习学习I/0输入输出,使用了IO中的File类、字符流和集合ArrayList等基础Java知识

    基本数据结构的模拟

    对基本数据结构的模拟,实现arrayList,hashMap,树,队列,栈的基本方法,对于学习数据结构有一定的帮助 LinkedList[] arr = new LinkedList[999]; // 键值对集合! Map底层结构是:数组 + 链表 int size = 0; // ...

    java模拟斗地主的洗牌发牌.rar

    用java中的集合来模拟斗地主的游戏的洗牌、发牌、看牌的过程,分别使用集合中的HashMap、ArrayList、TreeSet,来做为扑克牌的存储容器

    Arraylist的一些值得思考的问题

    1、初始化做了哪些事儿 ...4、模拟写一个新增或删除或扩容的方法 5、是否线程安全?为何不安全?如果不安全如何规避或替代类? 6、for循环数据过程中删除数据是否异常?如果异常,寻找为何异常?如何规避这个异常

    Biometric-Voters-System:使用Java通过Arraylist,HashMap和Collection模拟生物识别投票系统的系统

    生物识别投票系统 使用Java模拟使用Arraylist,HashMap和Collection团队成员的生物识别选民系统的系统:Omieibi Bagshaw Nii Aku Kwaku Adjei Aaron Adom Aaron Andoh Vanessa Bedzra

    创建一个Computer类

    (3)模拟用户输入(Scanner对象)编号获取对应的Computer信息,并且输出具体的参数。 (4)遍历输出ArrayList中的Computer,同时输出Computer的详细信息。 界面: 1---添加计算机 2---查询计算机(输入计算机...

    java数据结构课程设计——简易GPS导航(最优路径)源码+文档

    该系统带有模拟地图的加权无向图,直观的表现各地点间的关系及所做操作的响应结果 可通过鼠标操作或文本输入的形式输入相关信息 该系统还可获取当前时间,帮助信息,菜单栏选项设有热键 获得最短路径的主要思想...

    java模拟电影购票系统

    在控制台模拟电影购票系统,基于JavaBean+Map+List+Scanner+日志框架,分类商家类和客户类,商家类和客户类都继承用户类。商家功能:展示商家详情、上架电影、下架电影、修改上架的电影、退出系统。客户功能:展示...

    银行账户存取款业务

    蓄账户的对象(可以用数组或ArrayList实现)。该类包含以下方法: 开户:即增加一个新的账户,注意:不允许两个账户的账号相同 销户:即删除一个已有的账户 查询账户:根据一个账号,查询有无该账号的账户 统计目前银行...

Global site tag (gtag.js) - Google Analytics