常用的对数组进行的操作
1、求数组中最大值,最小值
思路:假设下标为0的元素是最大值,遍历数组,依次跟max进行比较,如果有元素比这个max还大,则把这个值赋给max。最小值同样
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
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、查找数组中是否存在某个元素
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
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)、用二分查找法查找数组中是否存在某个元素
前提:待查找的数组必须是有序的(大小有序)
原理:将待查找的元素与数组中中间下标的元素进行比较,如果大于中间元素,去右边查找,小于中间元素,去左边查找。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
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轮。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
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)
1
2
3
4
5
6
7
|
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)根据输入的元素删除数组中对应的元素
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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
1
2
3
4
5
|
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、调用带可变参数的方法时,数据类型必须与可变参数的类型对应。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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的个数,这样可以开辟新数组;从旧的数组之中,取出内容,并将其赋给新开辟的数组。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
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。使用递归实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
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基础之数组常用操作总结(必看篇)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。