数组的定义,参考Java 数组
数组的使用
1、定义一个数组
//必须初始化数组的长度,这里为10
int[] arr = new int[10];
for(int i = 0;i < arr.length; i++){
arr[i] = i;
}
//设置初始值
int[] score = new int [] {10,20,30};
2、自定义数组
public class CustomArray<E> {
private E[] data;
//数组长度
private int size;
/**
* 构造函数,传入数组的容量capacity构造数组
*/
public CustomArray(int capacity){
data = (E[])(new Object[capacity]);
size = 0;
}
/**
* 无参数的构造函数
*/
public CustomArray(){
this(10);
}
//获取数组中的元素个数
public int getSize(){
return size;
}
//获取数组的容量
public int getCapacity(){
return data.length;
}
public boolean isEmpty(){
return size == 0;
}
//向所有元素添加一个新元素
public void addLast(E e){
/*if(size == data.length){
throw new IllegalArgumentException("addLast fail, Array is already full");
}
data[size] = e;
size ++;*/
add(size, e);
}
//向所有元素添加一个新元素
public void addFirst(E e){
add(0, e);
}
//向第index个元素中插入一个新元素e
public void add(int index, E e){
if(index < 0 || index > size){
throw new IllegalArgumentException("addLast fail,require index < 0 || index > size");
}
//动态数组
if(size == data.length){
//throw new IllegalArgumentException("addLast fail, Array is already full");
// 扩容到原来数组长度的两倍
resize(2 * data.length);
}
for(int i = size -1; i>= index; i--){
//将i元素值往后移动1位
data[i+1] = data[i];
}
data[index] = e;
size++;
}
private void resize(int newCapacity) {
E[] newData = (E[]) new Object[newCapacity];
for(int i = 0; i < size; i ++){
newData[i] = data[i];
}
data = newData;
}
// 获取index索引位置的元素
E get(int index){
if(index < 0 || index >= size){
throw new IllegalArgumentException("get fail,require index < 0 || index >= size");
}
return data[index];
}
//修改index索引位置的元素e
void set(int index, E e){
if(index < 0 || index >= size){
throw new IllegalArgumentException("set fail,require index < 0 || index >= size");
}
data[index] = e;
}
//查找数组中是否有元素e
public boolean contains(E e){
for(int i = 0; i < size; i++){
if(data[i].equals(e)){
return true;
}
}
return false;
}
//查找数组中是否有元素e所在的索引,如果不存在元素e,则返回-1
public int find(E e){
for(int i = 0; i < size; i++){
if(data[i].equals(e)){
return i;
}
}
return -1;
}
//从数组中删除index位置的元素,返回删除的元素
public E remove(int index){
if(index < 0 || index >= size){
throw new IllegalArgumentException("set fail,require index < 0 || index >= size");
}
E ret = data[index];
for(int i = index +1; i < size; i++){
data[i-1] = data[i];
}
size--;
//loitering objects != memory leak 这句话不是不必须的
data[size] = null;
//数据只有容量的1/4的时候
if(size <= data.length / 4 && data.length / 2 != 0){
//缩小容量为当前容量的一半
resize(data.length / 2);
}
return ret;
}
//从数组中删除第一个位置的元素,返回删除的元素
public E removeFirst(){
return remove(0);
}
//从数组中删除最后一个位置的元素,返回删除的元素
public E removeLast(){
return remove(size - 1);
}
//从数组中删除元素e
public void removeElement(E e){
int index = find(e);
if(index != -1){
remove(index);
}
}
@Override
public String toString(){
StringBuilder sb = new StringBuilder();
sb.append(String.format("Array size= %d, capacity = %d ", this.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();
}
}
自定义数组测试:
public static void main(String[] args) {
CustomArray<Integer> arr = new CustomArray(20);
for(int i = 0; i < 10; i++){
arr.addLast(i);
}
System.out.println(arr); //输出: Array size= 10, capacity = 20 '[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]'
arr.add(1, 100);
System.out.println(arr); // 输出: Array size= 11, capacity = 20 '[0, 100, 1, 2, 3, 4, 5, 6, 7, 8, 9]'
arr.addFirst(200);
System.out.println(arr); // 输出:Array size= 12, capacity = 20 '[200, 0, 100, 1, 2, 3, 4, 5, 6, 7, 8, 9]'
//删除索引为2的元素
arr.remove(2);
System.out.println(arr); //输出: Array size= 11, capacity = 20 '[200, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]'
//删除元素6
arr.removeElement(6);
System.out.println(arr); // 输出: Array size= 10, capacity = 20 '[200, 0, 1, 2, 3, 4, 5, 7, 8, 9]'
//移除第一个元素
arr.removeFirst();
System.out.println(arr); // 输出: Array size= 9, capacity = 20 '[0, 1, 2, 3, 4, 5, 7, 8, 9]'
}
增加容量测试:
/**
* 增加容量测试
*/
private void addCapacityTest(){
//动态数组测试。容量为10
CustomArray<Integer> arr = new CustomArray(10);
for(int i = 0; i < 10; i++){
arr.addLast(i);
}
System.out.println(arr); //Array size= 10, capacity = 10 '[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]'
//新增一个数字,自动进行扩容
arr.add(1, 100);
System.out.println(arr); // 输出: Array size= 11, capacity = 20 '[0, 100, 1, 2, 3, 4, 5, 6, 7, 8, 9]'
}
/**
* 较少容量测试
*/
private void reduceCapacity(){
//动态数组测试。容量为10
CustomArray<Integer> arr = new CustomArray(20);
for(int i = 0; i < 10; i++){
arr.addLast(i);
}
System.out.println(arr); //Array size= 10, capacity = 10 '[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]'
arr.remove(2);
System.out.println(arr); // 输出: Array size= 9, capacity = 10 '[0, 1, 3, 4, 5, 6, 7, 8, 9]'
}
使用类型为Student测试
public class Student {
private String name;
private int score;
public Student(String name, int score){
this.name = name;
this.score = score;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", score=" + score +
'}';
}
public static void main(String[] args) {
CustomArray<Student> arr = new CustomArray<Student>();
arr.addLast(new Student("zhangsan",50));
arr.addLast(new Student("lisi",60));
arr.addLast(new Student("wangwu",55));
System.out.println(arr); //输出: Array size= 3, capacity = 10 '[Student{name='zhangsan', score=50}, Student{name='lisi', score=60}, Student{name='wangwu', score=55}]'
}
}
作者:Work Hard Work Smart
出处:http://www.cnblogs.com/linlf03/
欢迎任何形式的转载,未经作者同意,请保留此段声明!
浙公网安备 33010602011771号