故事Java数据结构之数组背后的故

package cn.Arrays.lpq;
/**
* 在数组中添加元素
* 1.在末尾位置添加元素
* 2.在数组元素中任意位置添加元素
* @author Administrator
*
*/
public class Array1 {
private E [] data;
private int size;
//有参构造,确定数组容量为capacity
public Array1(int capacity){
data=(E[])new Object[capacity];
size=0;
}
//无参构造,默认数组容量为10;
public Array1(){
this(10);
}
//获取数组容量
public int getCapacity(){
return data.length;
}
//获取数组中元素的个数
public int getSize(){
return size;
}
//判断数组是否为空
public boolean isEmpty(){
return size==0;
}
//在元素的最后位置添加元素
public void addLast(E e){
add(size,e);
}
//在数组的第一个位置上添加元素
public void addFirst(E e){
add(0,e);
}
//在数组中的任意位置添加元素
public void add(int index,E e){

    if(index<0 || index>size){
        throw new IllegalArgumentException("该索引位置不可以插入元素!");
    }
    if(size==data.length){
        resize(2*data.length);//数组如果不够用,则扩容
    }
    for(int i=size-1;i>=index;i--){
        data[i+1]=data[i];

    }
    data[index]=e;
    size++;

}
//更改对应索引上的元素
public void set(int index,E e){
    if(index<0|| index>=size){
        throw new IllegalArgumentException("该索引不合法!");
    }
    data[index]=e;
}
//获取对应索引位置上的元素
public E get(int index){
    if(index<0|| index>=size){
        throw new IllegalArgumentException("该索引不合法!");
    }
    return data[index];
}
//显示数组中的元素
public String toString(){
    StringBuilder sb=new StringBuilder();
    sb.append(String.format("Array: size=%d, capacity=%d\n", size,data.length));
    sb.append("[");
    for(int i=0;i<size;i++){
        sb.append(data[i]);
        if(i!=size-1){
            sb.append(", ");
        }

    }
    sb.append("]");
    return sb.toString();

}
//判断数组中是否有元素e
public boolean  contains(E e){
    for(int i=0;i<size;i++){
        if(data[i].equals(e)){
            return true;
        }

    }
    return false;
}
//找出对应元素对应的索引
public int find(E e){
    for(int i=0;i<size;i++){
        if(data[i].equals(e)){
            return i;
        }
    }
    return -1;
}
//删除元素,并返回删除的元素
public E remove(int index){
    if(index<0||index>=size){
        throw new IllegalArgumentException("该索引不合法!");
    }
    E res=data[index];
    for(int i=index+1;i<size;i++){
        data[i-1]=data[i];
    }
    size--;
    if(size==data.length/4&&data.length/2!=0){
        resize(data.length/2);//当数组中的元素个数小于等于数组容量的一般时,则动态的减少数组容量,将数组的容量变为原来的一半
    }
    return res;
}
//删除数组第一个元素,并返回删除的元素
public E removeFirst(){
    return remove(0);
}
//删除数组最后一个元素,并返回删除的元素
public E removeLast(){
    return remove(size-1);//在调用remove方法时会帮我们判断数组是否为空
}
//查找元素e,如果找到则删除
public void removeElement(E e){//用户在删除指定元素后就已经知道元素了,所以不用返回值返回具体的删除的元素
    int index=find(e);//找到要删除的元素的对应的索引
    if(index!=-1){
        remove(index);
    }
}
//对数组进行扩容,动态数组
private void resize(int newCapacity){
        E [] newdata=(E[])new Object[newCapacity];
        for(int i=0;i<size;i++){
            newdata[i]=data[i];
        }
        data=newdata;
}

}
测试用例1:
package cn.Arrays.lpq;

public class ArrayTest {
public static void main(String[] args) {
Array1 arr=new Array1();
for(int x=0;x<10;x++){
arr.addLast(x);
}
System.out.println(arr);
arr.addLast(22);
System.out.println(arr);
arr.addFirst(-1);
System.out.println(arr);
arr.remove(2);
arr.removeFirst();
arr.removeLast();
System.out.println(arr);
// arr.set(2, 100);
// System.out.println(arr);
// arr.get(3);
// arr.removeFirst();
// System.out.println(arr);
}
}
测试用例2:
package cn.Arrays.lpq;

public class Student {
private String name;
private int scores;
public Student(String Name,int Scores){
name=Name;
scores=Scores;
}
public String toString(){
return String.format(“Student:(%s,%d)”,name,scores);
}
public static void main(String []args){
Array1 arr=new Array1();
arr.addLast(new Student(“axlpq”,99));
arr.addLast(new Student(“axlpq1”,88));
arr.addLast(new Student(“axlpq3”,77));
System.out.println(arr);
axlpq a=new axlpq();
a.sum1();
}

}
class axlpq{
public void sum1(){
int sum=0;
for(int i=1;i<=100;i++){
sum+=i;
}
System.out.println(sum);

}

}

猜你喜欢

转载自blog.csdn.net/lpq1201/article/details/80014388