java基础之数组常用操作总结(必看篇)

作者:jingxian 时间:2022-12-09 03:32:17 

常用的对数组进行的操作

1、求数组中最大值,最小值

思路:假设下标为0的元素是最大值,遍历数组,依次跟max进行比较,如果有元素比这个max还大,则把这个值赋给max。最小值同样


public class TestArray{
 public static void main(String[] args){
   int[] arr={23,45,234,576,34,87,34,12,67};
   int max=arr[0];
   int min=arr[0];
   for(int i=0;i<arr.length;i++){
     if(arr[i]>max){
       max=arr[i];
     }
     if(arr[i]<min){
       min=arr[i];
     }
   }
   System.out.println("数组中最大值为:"+max);
   System.out.println("数组中最小值为:"+min);
 }
}

2、查找数组中是否存在某个元素


import java.util.Scanner;
public class TestArray{
 public static void main(String[] args){
   Scanner in=new Scanner(System.in);
   int[] arr={23,45,234,576,34,87,34,12,67};
   System.out.println("请输入你要查找的元素");
   int element=in.nextInt();
   int i,flag=0;
   for(i=0;i<arr.length;i++){
     if(arr[i]==element){
       flag=1;
       break;
     }
   }
   if(flag==1){
     System.out.println("你要查找的元素的下标为:"+i);
   }else{
     System.out.println("你要查找的元素不存在");
   }
 }
}

(2)、用二分查找法查找数组中是否存在某个元素

前提:待查找的数组必须是有序的(大小有序)

原理:将待查找的元素与数组中中间下标的元素进行比较,如果大于中间元素,去右边查找,小于中间元素,去左边查找。


public static int binarySearch(int[] arr,int ele){
   int left=0;
   int right=arr.length-1;
   int mid;
   int index=-1;
   while(left<=right){
     mid=(left+right)/2;
     if(arr[mid]==ele){
       index=mid;
       break;
     }else if(arr[mid]<ele){
       left=mid+1;
     }else if(arr[mid]>ele){
       right=mid-1;
     }
   }
   return index;
 }

3、对数组进行排序

(1)、冒泡排序

原理:相邻元素进行比较,小的往前赶,大的往后冒,最大值出现的最大索引处

分析:第一次进行比较,大的往后冒,会把最大值排在最大索引处

第二次进行比较,因为最大值已经确定了,只需要比较前n-1个元素即可,确定一个第二大值排在第二大索引处

依次确定第三大值,第四大值.............

结论:N个数字来排队,两两比较小靠前,外层循环n-1,内层循环n-1-i

java基础之数组常用操作总结(必看篇)


public class TestArray{
 public static void main(String[] args){
   int[] arr={10,3,8,1,6};
   //外层循环控制比较轮数
   for(int i=0;i<arr.length-1;i++){
     //内层循环控制每轮比较次数
     for(int j=0;j<arr.length-1-i;j++){
       if(arr[j]>arr[j+1]){
         int temp=arr[j];
         arr[j]=arr[j+1];
         arr[j+1]=temp;
       }
     }
   }
   //遍历数组
   for(int i=0;i<arr.length;i++){
     System.out.println(arr[i]);
   }
 }
}

(2)、选择排序

原理:从下标0处开始,依次和后边的元素进行比较,如果后面元素小于下标0的元素,换位。拿新的下标为0的元素和后边的进行比较。第一次完毕,最小值出现在索引0处

例:{10,3,8,1,6}

第一轮比较,从0下标元素开始,依次和后边的元素进行比较,先是10和3进行比较,10<3,交换位置,下标0的元素变成3,{3,10,8,1,6};再拿3和8比较,3<8,不换位;3和1进行比较,3>1,换位

{1,10,8,3,6},然后拿1和6进行比较,1<6,不换位置。第一轮结束,{1,10,8,3,6}

第二轮比较,上一轮已经确定了下标0的元素为最小值,这轮比较从下标1开始,先是10和8比较,换位{1,8,10,3,6};8和3比较,换位{1,3,10,8,6},3和6比较,不换位。第二轮结束,确定倒数第二小的元素在下标1位置。

........

共比较length-1轮。

java基础之数组常用操作总结(必看篇)


public class TestArray{
 public static void main(String[] args){
   int[] arr={10,3,8,1,6};
   for(int i=0;i<arr.length-1;i++){
     for(int j=i+1;j<arr.length;j++){
       if(arr[i]>arr[j]){
         int temp=arr[i];
         arr[i]=arr[j];
         arr[j]=temp;
       }
     }
   }
   //遍历数组
   for(int i=0;i<arr.length;i++){
     System.out.println(arr[i]);
   }
 }
}

4、删除数组中元素

(1)根据下标删除元素(空位补0)


public static void delete(int[] arr,int index){
   for(int i=index;i<arr.length-1;i++){
     arr[i]=arr[i+1];
   }
   arr[arr.length-1]=0;
   System.out.println(Arrays.toString(arr));
 }

(2)根据输入的元素删除数组中对应的元素


public static void delete(int[] arr,int ele){
   int index=-1;
   for(int i=0;i<arr.length;i++){
     if(arr[i]==ele){
       index=i;
     }
   }
   for(int i=index;i<arr.length-1;i++){
     arr[i]=arr[i+1];
   }
   arr[arr.length-1]=0;
   System.out.println(Arrays.toString(arr));
 }

下面介绍一些API里面常见的对数组的操作

在java中,除java.lang包下的类和接口可以直接使用外,其他包下的类或接口在使用时需要先导包。

java.util.Arrays类:此类包含用来操作数组(比如排序和搜索)的各种方法。

这些都是静态方法,可以类名.方法名直接使用,这里都以int型数组为例

1、对数组进行快速排序

Arrays.sort(int[] arr);对传入的数组默认进行升序排序

2、返回指定数组内容的字符串表现形式。

Arrays.toString(int[] arr);

3、使用二分法搜索制定数组中的某个元素的下标

Arrays.binarySearch(int[] arr);

4、将将指定的 int 值分配给指定 int 型数组的每个元素。

Arrays.fill(int[] arr,int val);

5、复制指定的数组,截取或用 0 填充(如有必要),以使副本具有指定的长度。

Arrays.copyOf(int[] arr,int newLength);它的返回值是一个数组

6、将指定数组的指定范围复制到一个新数组。 包含起始位置但不包含结束位置。

Arrays.copyOfRange(int[] arr,int from,int to);它的返回值是一个数组

 

其他数组知识:

1、命令行参数:可以在执行java命令时为main方法传入参数值。

用法:运行java命令时传入命令行参数: java 类名 "值1" "值2"...

public static void main(String[] args){},我们可以看到main方法是一个有参的方法,参数是一个字符串数组,在命令行为main方法传值时,传入的值都保存在args字符数组里。

注意:多个参数值之间用空格分割。参数的值将会保存到字符串数组传入main方法,下标从零开始。

在获取命令行参数时需要注意下标不能越界,最大下标应该为参数的个数-1


public static void main(String[] args){
    for(int i=0;i<args.length;i++){
        System.out.println(args[i]);
    }
}

2、可变参数

可变参数是java1.5之后的新特性,可以代表零到多个相同数据类型的变量,是为了解决因参数个数的变化而导致过多的方法重载问题。

注意:

1、可变参数只能用于形式参数(方法定义时),可以把可变参数当作数组来处理。

2、一个方法在最多只能有一个可变参数,可变参数必须作为最后一个参数。

3、调用带可变参数的方法时,数据类型必须与可变参数的类型对应。


public class Test1 {
 public static void main(String[] args){
   double sum=add(4,2.1,3.4,1.2);
   System.out.println(sum);
 }
 public static double add(int a,double...b){
   double sum=a;
   for(int i=0;i<b.length;i++){
     sum+=b[i];
   }
   return sum;
 }
}

例题:

合并数组操作:现有如下一个数组:   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: int newArr [] ={1,3,4,5,6,6,5,4,7,6,7,5} 

思路: 确定出不为0的个数,这样可以开辟新数组;从旧的数组之中,取出内容,并将其赋给新开辟的数组。


public class Test1 {
 public static void main(String[] args){
   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
   int[] arr=mergeArrays(oldArr);
   System.out.println(Arrays.toString(arr));
 }
 public static int[] mergeArrays(int[] oldArr){
   int count=0;
   for(int i=0;i<oldArr.length;i++){
     if(oldArr[i]!=0){
       count++;
     }
   }
   int[] newArr=new int[count];
   int index=0;
   for(int i=0;i<oldArr.length;i++){
     if(oldArr[i]!=0){
       newArr[index]=oldArr[i];
       index++;
     }
   }
   return newArr;
 }
}

2、使用二分法查找有序数组中元素。找到返回索引,不存在输出-1。使用递归实现


public class Test1 {
 public static void main(String[] args){
   int[] arr={1,2,3,4,5,6,7,8};
   int index=binarySearch(arr,6,0,arr.length-1);
   System.out.println(index);
 }
 public static int binarySearch(int[] arr,int ele,int left,int right){
   int mid=(left+right)/2;
   if(arr[mid]==ele){
     return mid;
   }else if(arr[mid]<ele){
     return binarySearch(arr,ele,mid+1,right);
   }else if(arr[mid]>ele){
     return binarySearch(arr,ele,left,mid-1);
   }
   return -1;
 }
}
标签:java,数组,常用操作
0
投稿

猜你喜欢

  • Android自定义View实现微信语音界面

    2022-03-27 20:35:27
  • C#实现BBcode转为Markdown的方法

    2021-10-11 12:34:12
  • C# 指针内存控制Marshal内存数据存储原理分析

    2021-09-22 04:05:00
  • C#串口通信工具类的封装

    2023-11-23 11:19:54
  • Unity3D实现虚拟按钮控制人物移动效果

    2022-06-13 04:26:26
  • Java以命令模式设计模式

    2023-11-24 21:27:52
  • 解决grails服务端口冲突的办法(grails修改端口号)

    2023-09-12 01:00:03
  • SpringMVC后端返回数据到前端代码示例

    2023-06-20 13:12:47
  • Spring如何使用注解的方式创建bean

    2022-01-29 03:45:49
  • Java中PriorityQueue实现最小堆和最大堆的用法

    2022-03-25 14:32:18
  • Java并发编程之同步容器与并发容器详解

    2023-10-17 04:06:23
  • C#通过指针读取文件的方法

    2023-02-21 03:08:10
  • C++实现俄罗斯方块源码

    2023-06-27 23:49:14
  • 解决IDEA service层跳转实现类的快捷图标消失问题

    2022-09-03 06:38:00
  • c# 通过代码开启或关闭防火墙

    2021-12-11 19:53:20
  • Java中new关键字和newInstance方法的区别分享

    2022-12-04 03:12:52
  • Java中lock和tryLock及lockInterruptibly的区别

    2023-05-27 11:33:56
  • C#对Json进行序列化和反序列化

    2023-04-16 09:06:15
  • SpringBoot Security前后端分离登录验证的实现

    2023-03-09 10:30:07
  • Spring Cloud 动态刷新配置信息教程详解

    2023-12-02 04:48:16
  • asp之家 软件编程 m.aspxhome.com