Java编程基础——数组删除元素操作汇总

有关java中数组操作总结——如何删除指定位置的元素
package s01_javabasic.summary;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @描述 移除数组指定位置元素的方法{删除数组中的一个元素并且向前移}
 * @创建人 Cheri_du
 * @创建时间 2018年3月31日下午10:48:43
 * @修改人
 * @修改时间 2018年3月31日下午10:48:43
 * @since JDK 1.8
 */
public class RemoveArrayEle {

	public static void main(String[] args) {
		int[] arr = { 1, 5, 7, 9, 12 };
		int index = 2;
		// 将位置索引为2的元素移除
		int[] arr2 = removeElement5(arr, index);
		// 遍历移除以后的数组
		for (int i = 0; i < arr2.length; i++) {
			System.out.println(arr2[i]);
		}

		// 第三方工具
		// 16.删除数组中某个位置上的数据
		// arr = ArrayUtils.remove(arr, 2);
		// System.out.println(ArrayUtils.toString(arr));// {1,5,9,12}

		List list = Arrays.asList(arr);
		ArrayList<Integer> lis = new ArrayList<Integer>(list);

		// lis.remove(2);
		// list.remove(2);// java.lang.UnsupportedOperationException
		// 改进

	}

	// 位移法
	private static int[] removeElement(int[] arr, int index) {
		// 1.index前面的元素不变,后面的元素下标迁移1位,把指定元素移到最后
		for (int i = 0; i < arr.length - 1; i++) {
			// 将从指定位置的元素赋值为后一个元素,最后会把指定位置元素冲掉,最后的元素会和倒数第二的元素相同
			/*
			 * 初始化:          1 5 7 9 12
			 * i=0,1     1 5 7 9 12
			 * i=2       1 5 9 9 12
			 * i=3		 1 5 9 12 12
			 */
			if (i >= index) {
				arr[i] = arr[i + 1];
			}
		}

		// 2.数组大小缩小1个长度 ----1 5 9 12
		arr = Arrays.copyOf(arr, arr.length - 1);
		return arr;
	}

	// 截取法
	private static int[] removeElement2(int[] arr, int index) {
		// 1.将数组以指定元素为分管点截取成两个数组,再拼接即可

		int[] arr1 = new int[index];
		int[] arr2 = new int[arr.length - 1 - index];
		for (int i = 0; i < arr.length; i++) {
			if (i < index) {
				arr1[i] = arr[i];
			} else if (i > index) {
				arr2[i - index - 1] = arr[i];
			}
		}
		for (int i = 0; i < arr1.length; i++) {
			arr[i] = arr1[i];
		}
		for (int i = 0; i < arr2.length; i++) {
			arr[index + i] = arr2[i];

		}
		arr = Arrays.copyOf(arr, arr.length - 1);
		return arr;
	}

	// 中间变量法
	private static int[] removeElement3(int[] arr, int index) {
		/*
		 * 解决这个问题的思路(假设删除一个元素): 创建一个新的数组,长度为原来数组减1; 循环复制,匹配的不复制,不匹配的复制到新数组;
		 */
		int[] tempArr = new int[arr.length - 1];
		int idx = 0;
		for (int i : arr) {
			if (i != (arr[index])) {
				tempArr[idx++] = i;
			}
		}

		return tempArr;
	}

	// 截取法优化1
	private static int[] removeElement4(int[] arr, int index) {

		// 创建一个新的长度比arr小1的数组,以index为分割点分段复制元素到新数组中
		int[] ary = new int[arr.length - 1];

		System.arraycopy(arr, 0, ary, 0, index);
		System.arraycopy(arr, index + 1, ary, index, ary.length - index);
		return ary;
	}

	// 截取法优化2
	private static int[] removeElement5(int[] arr, int index) {

		// 创建一个新的长度比arr小1的数组,以index为分割点分段复制元素到新数组中
		int[] ary = arr;
		System.arraycopy(arr, index + 1, ary, index, arr.length - index - 1);
		// System.out.println(ary[ary.length-2]);
		ary = Arrays.copyOf(ary, ary.length - 1);// Arrays.copyOf内部还是调用System.arraycopy
		System.out.print(Arrays.toString(ary));
		return ary;
	}

}
这些方法可能不是最优的,如果大家有其他的方法,欢迎大家一起交流交流!一起学习

猜你喜欢

转载自blog.csdn.net/coder_boy_/article/details/79779581
今日推荐