0%

数组

System.arraycopy(src, srcPos, dest, destPos, length)

src:源数组

srcPos:复制源数组的起始位置

dest:目标数组

destPos:复制目标数组的起始位置

length:复制长度

举个例子:复制一个数组前3个

1
2
3
4
5
6
7
8
9
10
11
12
package Array;

public class copyArray {
public static void main(String[] args) {
int a[] = new int[]{18, 62, 68, 82, 65, 9};
int b[] = new int[3];
System.arraycopy(a, 0, b, 0, 3);
for(int item: b) {
System.out.print(item + " ");
}
}
}

output

1
18 62 68 
1
2
3
4
5
6
7
exercise
首先准备两个数组,他俩的长度是5-10之间的随机数,并使用随机数初始化这两个数组
([向数组填充随机数](https://how2j.cn/k/array/array-create/280.html#step2182)的办法,[参考这里](https://how2j.cn/k/array/array-create/280.html#step2182))

然后准备第三个数组,第三个数组的长度是前两个的和
通过System.arraycopy 把前两个数组合并到第三个数组中

java中产生随机数:

Math.random():产生0-1的浮点数

Math.random()*100:产生0-100的浮点数

(Math.random() + 6) * 10:产生5-10的浮点数

anser

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/*

exercise
首先准备两个数组,他俩的长度是5-10之间的随机数,并使用随机数初始化这两个数组
([向数组填充随机数](https://how2j.cn/k/array/array-create/280.html#step2182)的办法,[参考这里](https://how2j.cn/k/array/array-create/280.html#step2182))

然后准备第三个数组,第三个数组的长度是前两个的和
通过System.arraycopy 把前两个数组合并到第三个数组中
*/
package Array;

public class mergeArray {
public static void main(String[] args) {
int lengthA = (int)(Math.random() * 6) + 5;
int lengthB = (int)(Math.random() * 6) + 5;
int lengthC = lengthA + lengthB;
int[] a = new int[lengthA];
System.out.println("数组A:");
for(int i = 0; i < lengthA; i++) {
a[i] = (int)(Math.random() * 10);
System.out.print(a[i] + " ");
}
System.out.println();
int[] b = new int[lengthB];
System.out.println("数组B:");
for(int i = 0; i < lengthB; i++) {
b[i] = (int)(Math.random() * 10);
System.out.print(b[i] + " ");
}
int[] c = new int[lengthC];
System.arraycopy(a, 0, c, 0, lengthA);
System.arraycopy(b, 0, c, lengthA, lengthB);
for(int item : c) {
System.out.print(item + " ");
}
}
}

二维数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class HelloWorld {
public static void main(String[] args) {
//初始化二维数组,
int[][] a = new int[2][3]; //有两个一维数组,每个一维数组的长度是3
a[1][2] = 5; //可以直接访问一维数组,因为已经分配了空间

//只分配了二维数组
int[][] b = new int[2][]; //有两个一维数组,每个一维数组的长度暂未分配
b[0] =new int[3]; //必须事先分配长度,才可以访问
b[0][2] = 5;

//指定内容的同时,分配空间
int[][] c = new int[][]{
{1,2,4},
{4,5},
{6,7,8,9}
};

}
}

二维数组要求每个空间都必须先new才能使用(就是往里面放东西)

二维数组不一定要等长

exercise

1
2
定义一个5X5的二维数组。 然后使用随机数填充该二维数组。
找出这个二维数组里,最大的那个值,并打印出其二维坐标

answer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/*
定义一个5X5的二维数组。 然后使用随机数填充该二维数组。
找出这个二维数组里,最大的那个值,并打印出其二维坐标
*/
package Array;
class maxNum {
int val;
int x;
int y;
public maxNum(){

}
public maxNum(int val, int x, int y) {
this.val = val;
this.x = x;
this.y = y;
}
}
public class twoDimensionArray {
public static void main(String[] args) {
int[][] a = new int[5][5];
for(int i = 0; i < 5; i++) {
for(int j = 0; j < 5; j++) {
a[i][j] = (int)(Math.random() * 6 +5);
System.out.print(a[i][j] + " ");
}
System.out.println();
}
maxNum max = new maxNum(0, 0, 0);
for(int i = 0; i < 5; i++) {
for(int j = 0; j < 5; j++) {
if(a[i][j] > max.val) {
max.val = a[i][j];
max.x = i;
max.y = j;
}
}
}
System.out.printf("最大:%d 横坐标:%d 纵坐标:%d", max.val, max.x, max.y);
}
}

java.util.Arrays类常用方法

数组复制

使用System.arraycopy进行数组复制类似的, Arrays提供了一个copyOfRange方法进行数组复制。 不同的是System.arraycopy,需要事先准备好目标数组,并分配长度。 copyOfRange 只需要源数组就就可以了,就是目标数组不需要new

举例

1
2
3
4
5
6
7
8
9
10
11
12
13
package Array;

import java.util.Arrays;

public class copyOfArray {
public static void main(String[] args) {
int a[] = new int[] { 18, 62, 68, 82, 65, 9 };
int[] b = Arrays.copyOfRange(a, 0, 3);
for(int item : b) {
System.out.print(item + " ");
}
}
}

数组转换为字符串

通过Arrays.toString(a)

举例

1
2
3
4
5
6
7
8
9
10
11
12
13
package Array;

import java.util.Arrays;

public class arrayToString {
public static void main(String[] args) {
int a[] = new int[] { 18, 62, 68, 82, 65, 9 };
System.out.println("a的类别是:" + a.getClass().getName());
String stringA = Arrays.toString(a);
System.out.println(stringA);
System.out.println("stringA的类型是:" + stringA.getClass().getName());
}
}

输出

1
2
3
a的类别是:[I
[18, 62, 68, 82, 65, 9]
stringA的类型是:java.lang.String

排序

Arrays.sort(a)

举例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package Array;

import java.util.Arrays;

public class arraySort {
public static void main(String[] args) {
int a[] = new int[] { 18, 62, 68, 82, 65, 9 };
System.out.println("排序前:");
System.out.println(Arrays.toString(a));
System.out.println("排序后:");
Arrays.sort(a);
System.out.println(Arrays.toString(a));
}
}

输出

1
2
3
4
排序前:
[18, 62, 68, 82, 65, 9]
排序后:
[9, 18, 62, 65, 68, 82]

搜索

查询元素出现的位置 需要注意的是,使用binarySearch进行查找之前,必须使用sort进行排序 如果数组中有多个相同的元素,查找结果是不确定的

1
2
3
4
5
6
7
8
9
10
11
package Array;

import java.util.Arrays;

public class search {
public static void main(String[] args) {
int a[] = new int[] { 18, 62, 68, 82, 65, 9 };
Arrays.sort(a);
System.out.println("数字62出现的位置" + Arrays.binarySearch(a, 62));
}
}

输出

1
数字62出现的位置2

比较两个数组是否相同

1
2
3
4
5
6
7
8
9
10
11
package Array;

import java.util.Arrays;

public class compare {
public static void main(String[] args) {
int a[] = new int[] { 18, 62, 68, 82, 65, 9 };
int b[] = new int[] { 18, 62, 68, 82, 65, 8 };
System.out.println(Arrays.equals(a, b));
}
}

输出

1
false

填充

举例

1
2
3
4
5
6
7
8
9
10
11
package Array;

import java.util.Arrays;

public class fill {
public static void main(String[] args) {
int[] a = new int[10];
Arrays.fill(a, 5);
System.out.println(Arrays.toString(a));
}
}

输出

1
[5, 5, 5, 5, 5, 5, 5, 5, 5, 5]

exercise

1
2
3
4
5
6
首先定义一个5X8的二维数组,然后使用随机数填充满。
借助Arrays的方法对二维数组进行排序。
参考思路:
先把二维数组使用System.arraycopy进行数组复制到一个一维数组
然后使用sort进行排序
最后再复制回到二维数组。

answer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package Array.Arrays_method;

import java.util.Arrays;

public class exercise {
public static void main(String[] args) {
// 利用随机数构造二维数组
int[][] a = new int[5][8];
for(int i = 0; i < 5; i++) {
for(int j = 0; j < 8; j++) {
a[i][j] = (int)(Math.random() * 40);
System.out.print(a[i][j] + " ");
}
System.out.println();
}
// 本来是想利用Arrays.copyOfRange,但是Arrays.copyOfRange会对数组重新引用
// 将二维数组中内容复制到一维数组里面
int[] tmp = new int[40];
for(int i = 0; i < 5; i++) {
System.arraycopy(a[i], 0, tmp, i * 8, 8);
}
System.out.println();
for(int i = 0; i < 40; i++) {
System.out.print(tmp[i] + " ");
if((i + 1) % 8 == 0) {
System.out.println();
}
}
System.out.println();
// 对数组排序
Arrays.sort(tmp);
// 将一维数组中内容复制到二维数组里
for(int i = 0; i < 5; i++) {
a[i] = Arrays.copyOfRange(tmp, i * 8, (i + 1) * 8);
}
// 输出二维数组
for(int i = 0; i < 5; i++) {
for(int j = 0; j < 8; j++) {
System.out.print(a[i][j] + " ");
}
System.out.println();
}
}
}