萌新卷妹带你从头复习JavaSE-数组2
萌新卷妹带你从头复习JavaSE-数组2
✨欢迎关注🖱点赞🎀收藏⭐留言✒
🔮本文由京与旧铺原创,csdn首发!
😘系列专栏:java学习
💻首发时间:🎞2022年10月14日🎠
🎨你做三四月的事,八九月就会有答案,一起加油吧
🀄如果觉得博主的文章还不错的话,请三连支持一下博主哦
🎧最后的话,作者是一个新人,在很多方面还做的不好,欢迎大佬指正,一起学习哦,冲冲冲
💬推荐一款模拟面试、刷题神器👉[点击进入网站
🎨3.Java数组应用
🎳3.1利用数组求平均值与交换两个数
public class AvgSwap {
public static void swap(int[] data) {
int tmp = data[0];
data[0] = data[1];
data[1] = tmp;
}
public static double avg(int[] data) {
int sum = 0;
for (int i = 0; i < data.length; i++) {
sum += data[i];
}
return 1.0 * sum / data.length;
}
public static void main(String[] args) {
int[] swap = {22, 33};
int[] avg = {1,2,3,4,5,6,7,8,9,0};
System.out.println("数据交换前:a = " + swap[0] + ", b = " + swap[1]);
swap(swap);
System.out.println("数据交换后:a = " + swap[0] + ", b = " + swap[1]);
System.out.println("数组平均值为:" + avg(avg));
}
}
🎳3.2拷贝数组
import java.util.Arrays;
public class Copy {
public static int[] copy(int[] arr) {
if (arr == null) {
return null;
}
int[] copy = new int[arr.length];//新建一个数组
for (int i = 0; i < arr.length; i++) {
copy[i] = arr[i];//遍历拷贝
}
return copy;
}
public static void main(String[] args) {
int[] arr1 = {1,2,3,4,5,6,7,8,9};
System.out.println("数组1:");
System.out.println(Arrays.toString(arr1));
int[] arr2 = copy(arr1);
System.out.println("数组2:");
System.out.println(Arrays.toString(arr2));
}
}
当然Java中的Arrays
类有内置的拷贝方法: $static\ 数据类型[]\ copyOf(数据类型[]\ original,\ int\ newLength) $ 复制指定的数组,用零截取或填充(如有必要),以便复制具有指定的长度。
$static\ 数据类型[]\ copyOfRange(数据类型[]\ original,\ int\ from,\ int\ to) $ 将指定数组的指定范围[from, to)
复制到新数组中。 $static\ void\ arraycopy(Object\ src,\ int\ srcPos,\ Object\ dest,\ int\ destPos,\ int\ length) $ Object src
表示源数组,srcPos
表示从源数组开始拷贝的下标位置,Object dest
表示目标数组,destPos
表示表示从目标数组开始拷贝的下标位置,length
表示拷贝数组元素个数。 如果细心去查看该方法源代码,会发现该方法被native
修饰,这个表示这个方法是使用C/C++
实现的。 将指定源数组中的数组从指定位置复制到目标数组的指定位置。 $数组名.clone()$
最后一种就是利用数组名.clone
创建并返回此对象的副本。 “复制”的精确含义可能取决于对象的类。因为数组实例化后就是一个对象,该方法会返回值为对应类型的数组,所以使用该方法进行拷贝。
import java.util.Arrays;
public class Copy {
public static void main(String[] args) {
int[] arr1 = {1,2,3,4,5,6,7,8,9};
System.out.println("arr1:" + Arrays.toString(arr1));
int[] arr2 = Arrays.copyOf(arr1, arr1.length);
System.out.println("arr2:" + Arrays.toString(arr2));
int[] arr3 = Arrays.copyOf(arr1, arr1.length * 2);
System.out.println("arr3:" + Arrays.toString(arr3));
int[] arr4 = Arrays.copyOfRange(arr1, 1, 5);
System.out.println("arr4:" + Arrays.toString(arr4));
int[] arr5 = new int[arr1.length];
System.arraycopy(arr1, 0, arr5, 0, arr1.length);
System.out.println("arr5:" + Arrays.toString(arr5));
int[] arr6 = arr1.clone();
System.out.println("arr6:" + Arrays.toString(arr6));
}
}
另外,一般来说数组的拷贝是浅拷贝,因为Java中万物皆对象,对对象的拷贝就是浅拷贝,而数组也是一种对象,除非人为因素使实现深拷贝,如果数组中的为简单的数据类型一般都是深拷贝,如果数组中为引用类型一般都是浅拷贝。
🎳3.3数组转换字符串
再上述代码展示中我相信大家已经看到了Arrays.toString
方法的使用,它能将一个数组转换成带中括号字符串!现在我们来模拟一下这个方法:
public class StringArray {
public static String myToString(int[] arr) {
if (arr == null) {
return "[]";//空引用返回[]
}
String str = "[";//初始化字符串为[
for (int i = 0; i < arr.length - 1; i++) {
str += arr[i] + ",";//注意最后一个数组元素后无逗号
}
str += arr[arr.length - 1] + "]";//查漏补缺,补上最后一个元素和]
return str;
}
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7,8,9};
System.out.println(myToString(arr));
}
}
🎳3.4数组查找
⛳️3.4.1顺序查找
顺序查找是最简单的查找方法,直接遍历一遍数组就可以了。
public class Search {
public static void main(String[] args) {
//顺序查找元素,找到其下标,未找到则输出未找到
int[] arr = {1,2,3,4,5,6,7,8,9};
int k = 7;
int flag = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] == k) {
System.out.println("找到了!下标为:" + i);
flag = 1;
break;
}
}
if (flag == 0) {
System.out.println("未找到!");
}
}
}
⛳️3.4.2二分查找
然后就是我们已经非常熟悉的二分查找:
public class BinSearch {
public static int binSearch(int[] arr, int k) {
if (arr == null) {
return -1;
}
int left = 0;
int right = arr.length - 1;
int mid = left + (right - left) / 2;
while (left <= right) {
mid = left + (right - left) / 2;
if (k > arr[mid]) {
left = mid + 1;
}
else if (k < arr[mid]) {
right = mid - 1;
}
else {
return mid;
}
}
return -1;
}
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7,8,9};
int k = 7;
System.out.println(binSearch(arr, k));
}
}
🎳3.5数组的排列
⛳️3.5.1判断数组是否有序
使用两个计数棋进行计数(从1开始计数),遍历数组分别对数组前一项不小于后一项,数组后一项不小于前一项独立计数,如果计数结果有刚好等于数组长度的结果则数组有序。
public class ArraryOrder {
public static boolean arrOrder(int[] arr) {
if (arr == null) {
return false;
}
int cnt1 = 1;
int cnt2 = 1;
for (int i = 0; i < arr.length - 1; i++) {
if (arr[i] <= arr[i+1]) {
cnt1++;
}
if (arr[i] >= arr[i+1]) {
cnt2++;
}
}
if (cnt1 == arr.length || cnt2 == arr.length) {
return true;
}
else {
return false;
}
}
public static void main(String[] args) {
int[] arr1 = {1,2,3,4,5,6,7,8,9};
int[] arr2 = {9,8,7,6,5,4,3,2,1};
int[] arr3 = {2,1,4,7,5,9,8,3,6};
System.out.println(arrOrder(arr1));
System.out.println(arrOrder(arr2));
System.out.println(arrOrder(arr3));
}
}
⛳️3.5.2数组逆序
双指针,依次将左边元素与右边元素互换。
import java.util.Arrays;
public class ReverseArr {
public static void rever(int[] arr) {
if (arr == null) {
return;
}
int l = 0;
int r = arr.length - 1;
while (l < r) {
int tmp = arr[l];
arr[l] = arr[r];
arr[r] = tmp;
l++;
r--;
}
}
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7,8,9};
System.out.println("逆序前:");
System.out.println(Arrays.toString(arr));
System.out.println("逆序后:");
rever(arr);
System.out.println(Arrays.toString(arr));
}
}
⛳️3.5.3冒泡排序(升序)
从数组首位元素开始将数组的相邻两个元素进行比较,如果前面的元素比后面大,则进行交换否则不交换,每进行一趟排序就能将一个最大的数放在最后,如果需要把所有元素都排好序,需要进行数组元素个数减一趟排序。因为每一趟排序都会排出一个最大的数放在后面,也就是说每排序一趟就有一个数排序完成,所以每完成一趟排序,排序比较次数就减一,假设数组元素个数为size
,则一共要进行size-1
趟排序,第1趟排序比较次数为size-1
,随着趟数比较次数逐次递减,如果此时为第i
趟排序,则需要比较的次数为size - 1 - i
。比如10个元素进行冒泡排序,一共要进行9趟排序,第一趟需排序比较9次,第二趟8次,第三趟7次,以此类推。
import java.util.Arrays;
public class BubbleSort {
public static void bubbleSort(int[] arr) {
if (arr == null) {
return;
}
for (int i = 0; i < arr.length - 1; i++) {
int flag = 0;
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j+1]) {
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
flag = 1;
}
}
if (flag == 0) {
break;
}
}
}
public static void main(String[] args) {
int[] arr = {2,1,8,5,9,4,6,7,3};
System.out.println("排序前:");
System.out.println(Arrays.toString(arr));
bubbleSort(arr);
System.out.println("排序后:");
System.out.println(Arrays.toString(arr));
}
}
🎨4.二维数组
二维数组本质上也就是一维数组, 只不过每个元素又是一个一维数组.
前面我们知道了,我们是使用引用来指向一个数组的,那么二维数组其实一个类型为引用的数组,数组中的每个元素都是一个引用变量,引用变量中指向另一个一维数组。
二维数组定义:
$$数据类型\ 数组名称\ =\ new\ 数据类型\ 行数\ { 初始化数据 }$$
数组名称.length;//表示行数
数组名称[行数].length;//表示某一行的列数
public class TestBolg {
public static void main(String[] args) {
int[][] arr = new int[3][3];
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
arr[i][j] = 8 + i +j;
}
}
for (int i = 0; i < arr.length; i++) {
System.out.println(Arrays.toString(arr[i]));
}
}
}
- 点赞
- 收藏
- 关注作者
评论(0)