`
yun342173024
  • 浏览: 73822 次
  • 性别: 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底层实现

    模拟ArrayList底层实现 在Java中,ArrayList是一种常用的集合类,提供了许多实用的方法来操作集合数据,而本文则尝试模拟ArrayList的底层实现,通过自定义集合实现类MyArrayList,来实现基本的集合操作。 模拟...

    用C语言模拟ArrayList

    在C语言中,ArrayList是一种常见的数据结构,它模拟了Java或.NET等高级语言中的动态数组。ArrayList提供了在数组中添加、删除和查找元素的便利操作,而无需预先知道数组的大小。下面,我们将深入探讨如何用C语言实现...

    模拟java ArrayList Iterator

    模拟ArrayList的Iterator实现,我们需要创建一个内部类,实现Iterator接口。这个内部类需要维护一个指向ArrayList实际元素的指针,以便于在迭代过程中跟踪当前位置。以下是一个简单的模拟实现: ```java public ...

    ArrayList集合工具类

    通过查看源代码,我们可以学习到如何在JavaScript环境中模拟ArrayList的行为,以及如何处理与Java中的ArrayList不同的问题,如线程安全和动态扩容等。 总的来说,ArrayList集合工具类是Java编程中的核心组件,它在...

    JS ArrayList

    JS模拟ArrayList JS容器类

    ArrayList 深入理解底层

    ArrayList是Java集合框架中的一种重要实现,它是一个基于数组实现的动态列表。ArrayList在JDK 1.8中,其内部使用一个Object数组`elementData`来存储元素,因此它的性能受到数组操作的影响,比如添加、删除和查找。...

    js实现ArrayList功能附实例代码

    总的来说,通过使用JavaScript来模拟ArrayList,我们可以更加深入地理解数据结构的工作原理,并在实际应用中灵活运用。学习如何实现这样的功能有助于提高编程能力,并为解决更复杂的问题打下坚实的基础。

    JavaScript 实现基础 ArrayList 功能

    在JavaScript中,ArrayList是一种常见的数据结构,它模拟了Java中的ArrayList功能,允许程序员进行动态数组操作。虽然JavaScript原生不支持ArrayList,但我们可以利用数组(Array)对象来实现类似的功能。下面将详细...

    ArrayList和HashMap如何自己实现实例详解

    在MyArrayList类中,提供了`put`、`get`和`remove`方法来模拟ArrayList的基本操作。`put`方法用于添加元素,检查元素是否为空,以及数组是否需要扩容。`get`方法根据索引获取元素,如果索引超出范围则抛出异常。`...

    搜索框(js+ajax+servlet)

    ArrayList&lt;String&gt; suggestions = new ArrayList(); suggestions.add("北京"); suggestions.add("上海"); return suggestions; } } ``` Servlet通过`doPost`方法接收POST请求,提取关键词,然后模拟查询数据库...

    ArrayList

    C语言中并没有直接对应的ArrayList数据结构,但在C中可以使用动态数组的概念来模拟ArrayList的功能。通过malloc()动态分配内存,realloc()调整数组大小,以及free()释放内存,开发者可以实现类似ArrayList的操作。...

    JAVA视频教程.pdf

    还探讨了StringBuilder和StringBuffer在字符串操作中的高效使用,以及如何模拟ArrayList容器的底层实现。最后,讲解了多维数组的处理,数组的拷贝、排序算法(如二分法),以及常用类如包装类Integer、Number的JDK...

    c# 数组与集合(ArrayList)游戏开发高级使用举例

    在实际应用中,我们可以通过创建一个模拟的游戏场景来演示如何使用数组和ArrayList。例如,可以创建一个大提琴音乐节的模拟游戏,其中数组用来存储参赛选手的初始排名,ArrayList用来存储比赛过程中动态变化的排名。...

    ArrayList测试.

    ArrayList是.NET框架中System.Collections命名空间下的一个类,它是基于数组实现的动态列表。ArrayList提供了在集合中添加、删除、查找和访问元素的功能,适用于存储各种类型的数据。在这个ArrayList测试中,我们将...

    JSP_使用_Session_ArrayList_实现购物车程序

    根据给定的信息,本文将详细解释如何在Java Server Pages (JSP)中使用`HttpSession`和`ArrayList`来实现一个简单的购物车程序。本文主要分为以下几个部分:商品类(`Goods`)的设计、购物车功能实现的具体步骤、以及...

    数组模仿ArrayList

    ArrayList则是通过动态数组来模拟可变大小的列表,当添加或删除元素时,它会自动调整数组的大小以适应需求。因此,模仿ArrayList的第一步就是创建一个可扩展的数组。 ```java public class MyArrayList&lt;T&gt; { ...

    c代码-使用集合ArrayList对字符串进行存储和管理。

    在C语言中,我们可以通过定义一个结构体来模拟ArrayList,包含一个字符指针数组和一个记录当前数组大小的变量。 以下是一个简单的ArrayList结构体定义: ```c typedef struct ArrayList { char** elements; int ...

    MyArrayList.java

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

    Java中ArrayList类的用法.docx

    在JavaScript中,虽然没有内置的ArrayList类,但可以使用Array对象模拟类似的功能,因为Array在JavaScript中是动态的,可以随时添加、删除或修改元素。然而,JavaScript的Array不提供像ArrayList那样的线程同步功能...

Global site tag (gtag.js) - Google Analytics