当前位置: 移动技术网 > IT编程>开发语言>Java > 数组的复杂使用(反转,简单扩容,删减,指定位置扩容)

数组的复杂使用(反转,简单扩容,删减,指定位置扩容)

2020年07月03日  | 移动技术网IT编程  | 我要评论

数组是我们开发中经常使用的一种技术,因此也很重要。
下面我先来引出为什么用数组。
在这里插入图片描述思路:定义6个变量,加起来总体重????
首先来简单介绍一下数组:
个人语言理解:数组就是一组可以存放多个同一类型数据的容器。同时数组也是一种数据类型,但是它是引用类型。既数组就是一组数据。
因此我们可以将其数据放到数组中进行计算。

先体验一把:
数组的简单语法和格式我就不在赘述,主要分析一下注意细节:

  1. 数组是多个相同类型数据的组合,实现对这些数据的统一管理。

  2. 数组中的元素可以是任何数据类型,包括基本数据类型,引用数据类型。但是不能混用

  3. 数组创建后,如果没有赋值,有默认值:
    int 0,short 0, byte 0, long 0, float 0.0,double 0.0,char \u0000,boolean false, String null。主要注意boolean,它的默认值是false,不是true。

  4. 数组的下标是从0开始的。

  5. 数组下标必须在指定范围内使用,否则报:下标越界异常,比如 int [] arr=new int[5]; 则有效下标为 0-4。

  6. 数组属引用类型,数组型数据是对象(object),数组中的每个元素相当于该对象的成员变量。

开撸:

1.反转

随机生成五个数, 并将其反转打印,把数组组的元素反转。arr{1,2,3,4,5}->{5,4,3,2,1}
//思路分析:找规律反转
//1.将第一个位置的数和最后的一个位置反转(最后一个位置刚好是length-1)。
//2.将第二个位置的数和倒数第二个位置数反转。
//3.交换的次数只能是数组的长度一半。(若次数是数组长度,那么当循环交换。)

int[] arr={1,2,3,4,5};
int temp=0;
for(int i=0;i<arr.length/2;i++){
temp=arr[i];
arr[i]=arr[arr.length-1-i];
arr[arr.length-1-i]=temp;
}//循环完毕时 则数组反转完成

完整代码:

import java.util.Scanner;
//数组元素反转
public class ArrayApply5  
{
	public static void main(String[] args) {
		
		int[] arr = {1, 2, 3, 4, 5, 10};
		int temp = 0;
		for( int i = 0 ;  i <  arr.length / 2; i++) { // i 次数, 同时下标
			
			temp = arr[i];
			arr[i] = arr[arr.length-1 - i];
			arr[arr.length-1 - i] = temp;
		}
		System.out.println("==============");

		for( int i = 0; i < arr.length; i++) {
			System.out.print(arr[i] + "\t");
		}
		
	}
}


2.简单扩容

  1. 要求:实现动态的给数组添加元素效果,实现对数组扩容。。
  2. 原始数值使用静态分配 int[] arr = {1,2,3}
  3. 增加的元素,直接放在数组的最后 arr = {1,2,3,4}
    arrNew = {1,2,3,4}
  4. 用户可以通过如下方法来决定是否继续添加,添加成功,是否继续?y/n
    //思路分析:
  1. 新申请一个数组,数组长度是原数组长度+1
  2. 让原数组的对新数组的数据复制
  3. 再将要插入的数插在新建的最后一个位置。
  4. 再讲新数组的地址给初始数组,初始的数组将被回收。这样做就不用在对新数组进行++操作了。

核心代码:

 //先实现一次的扩容
 int[] newarr=int[arr.length+1];
 for(int i=0;i<newarr.length;i++){
 newarr[i]=arr[i];
}
//此时新数组的最后一个位置数据是0,接着将要添加的数插入。
newArr[newArr.length - 1] = addNum;//1,2,3,4,88
arr=newarr;//让arr1 指向新的扩容后的数组,原来的数组当做垃圾被回收

完整代码:

import java.util.Scanner;
//数组扩容
public class ArrayApply5  
{
	public static void main(String[] args) {
		int[] arr1 = {1,2,3};
		char choice = ' '; //选择
		Scanner myScanner = new Scanner(System.in);
		int addNum = 88;
		//增加一个88 到 arr1 中
		int[] newArr = new int[arr1.length + 1]; // {0,0,0,0}
		for( int i = 0; i < arr1.length; i++) { // {1,2,3,0}
			newArr[i] = arr1[i];
		}
		newArr[newArr.length - 1] = addNum; // {1,2,3,88}
		arr1 = newArr; //让arr1 指向新的扩容后的数组,原来的数组当做垃圾被回收
		System.out.println("===========");
		for( int i = 0; i < arr1.length; i++) { // {1,2,3,0}
			System.out.print(arr1[i] + "\t");
		}
		
	}
}

这只能扩容一次,如何根据输入的来扩容,那么肯定是要循环,这里选择do…while…先给框架建起来。

public class ArrayApply5  
{
	public static void main(String[] args) {
		
		int[] arr1 = {1,2,3};
		//将代码改进成可以循环添加的效果
		int addNum = 88;
		char choice = ' '; //选择
		Scanner myScanner = new Scanner(System.in);
		do
		{
			System.out.println("是否继续添加 y/n");
			choice = myScanner.next().charAt(0);
			if(  choice == 'y' ) {
			System.out.println("请输入一个整数");
			addNum = myScanner.nextInt();	
		}while ( choice != 'n' );
	
	}
}

接下来只要把一次添加的放进循环就可以用
完整代码:

import java.util.Scanner;
//数组扩容
public class ArrayApply5  
{
	public static void main(String[] args) {
		
		int[] arr1 = {1,2,3};
		//将代码改进成可以循环添加的效果
		int addNum = 88;
		char choice = ' '; //选择
		Scanner myScanner = new Scanner(System.in);
		do
		{
			System.out.println("是否继续添加 y/n");
			choice = myScanner.next().charAt(0);
			if(  choice == 'y' ) {
				System.out.println("请输入一个整数");
				addNum = myScanner.nextInt();	
				//代码拿来
				int[] newArr = new int[arr1.length + 1]; // {0,0,0,0}
				for( int i = 0; i < arr1.length; i++) { // {1,2,3,0}
					newArr[i] = arr1[i];
				}
				newArr[newArr.length - 1] = addNum; // {1,2,3,88}
				arr1 = newArr; //让arr1 指向新的扩容后的数组,原来的数组当做垃圾被回收
				System.out.println("===========");
				for( int i = 0; i < arr1.length; i++) { // {1,2,3,0}
					System.out.print(arr1[i] + "\t");
				}
			}
		}while ( choice != 'n' );

	}
}

好了,搞定。剩下的两个请关注明天的…

本文地址:https://blog.csdn.net/qq_40530040/article/details/107073568

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网