数组的复杂使用(反转,简单扩容,删减,指定位置扩容)
数组是我们开发中经常使用的一种技术,因此也很重要。
下面我先来引出为什么用数组。
思路:定义6个变量,加起来总体重????
首先来简单介绍一下数组:
个人语言理解:数组就是一组可以存放多个同一类型数据的容器。同时数组也是一种数据类型,但是它是引用类型。既数组就是一组数据。
因此我们可以将其数据放到数组中进行计算。
先体验一把:
数组的简单语法和格式我就不在赘述,主要分析一下注意细节:
-
数组是多个相同类型数据的组合,实现对这些数据的统一管理。
-
数组中的元素可以是任何数据类型,包括基本数据类型,引用数据类型。但是不能混用。
-
数组创建后,如果没有赋值,有默认值:
int 0,short 0, byte 0, long 0, float 0.0,double 0.0,char \u0000,boolean false, String null。主要注意boolean,它的默认值是false,不是true。 -
数组的下标是从0开始的。
-
数组下标必须在指定范围内使用,否则报:下标越界异常,比如 int [] arr=new int[5]; 则有效下标为 0-4。
-
数组属引用类型,数组型数据是对象(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.简单扩容
- 要求:实现动态的给数组添加元素效果,实现对数组扩容。。
- 原始数值使用静态分配 int[] arr = {1,2,3}
- 增加的元素,直接放在数组的最后 arr = {1,2,3,4}
arrNew = {1,2,3,4} - 用户可以通过如下方法来决定是否继续添加,添加成功,是否继续?y/n
//思路分析:
- 新申请一个数组,数组长度是原数组长度+1
- 让原数组的对新数组的数据复制
- 再将要插入的数插在新建的最后一个位置。
- 再讲新数组的地址给初始数组,初始的数组将被回收。这样做就不用在对新数组进行++操作了。
核心代码:
//先实现一次的扩容
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