Java学习——数组练习
1.数组转字符串
1.1 直接打印
- 1.代码
public class arrExercise {
public static void main(String[] args) {
int [] arr={1,2,3,4,5,6};
//直接打印数组只是一个类似地址的东西,并不是数组的内容
System.out.println(arr);
}
}
- 结果
1.2 编写一个方法进行打印
- 代码
public class arrExercise {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6};
//直接打印数组只是一个类似地址的东西
// System.out.println(arr);
//要想打印数组内容,我们需要将数组转化成字符串再进行打印
String result = arrTostring(arr);
System.out.println(result);
}
public static String arrTostring(int[] arr) {
String result = "[";
for (int i = 0; i < arr.length; i++) {
result += arr[i];
if (i != arr.length - 1) {
result += ", ";
}
}
result += "]";
return result;
}
- 结果
1.3 Java标准库中提供了直接打印数组转成字符串Arrarys.toString(arr);
- 代码
import java.util.Arrays;
public class arrExercise {
public static void main(String[] args) {
//Java标准库中提供了直接把数组转成String的方法
int [] arr={1,2,3,4,5,6};
String resutlt =Arrays.toString(arr);
System.out.println(resutlt);
}
}
- 结果
2.数组拷贝
Java中,直接使用“=”赋值的方式,不能拷贝数组
2.1 “=”赋值并不能进行数组拷贝
- 代码
public class arrExercise {
public static void main(String[] args) {
int [] arr={1,2,3,4,5,6};
//这样的写法相当于给arr又起了一个别名叫arr2,
int [] arr2=arr;
arr[0]=10;
System.out.println(arr2[0]);
}
}
- 结果
从结果可以看到我们把arr的0号元素修改为10,打印输出arr2的0号元素也是10。其实arr和arr2都指向同一个地址就是{1,2,3,4,5,6}的地址。
2.2 编写一个方法进行数组拷贝
- 代码
public class arrExercise {
public static void main(String[] args) {
int [] arr={1,2,3,4,5,6};
int [] arr2=copyArray(arr);
arr[0]=10;
System.out.println(arr[0]);
System.out.println(arr2[0]);
}
public static int[] copyArray(int[] arr) {
//首要操作是一定要创建一个新的数组
int[] result=new int[arr.length];
for (int i=0;i<arr.length;i++) {
result[i]=arr[i];
}
return result;
}
}
- 结果
2.3 Java标准库中提供了数组拷贝Arrary.copyof(数组名,数组长度)
- 代码
import java.util.Arrays;
public class arrExercise {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6};
int[] arr2 = Arrays.copyOf(arr, arr.length);
arr[0] = 7;
System.out.println(arr[0]);
System.out.println(arr2[0]);
}
}
- 结果
3.找出数组元素中的最大元素
3.1 创建一个方法找数组中最大元素
- 代码
//求数组中最大值
public class arrExercise {
public static void main(String[] args) {
//打擂台思想:从数组中上去擂台一个元素,然后其他元素依次上擂台进行比较,
// 每次比较只留下最大的
int[] arr = {9,5,2,7,3,6,10};
int result =max(arr);
System.out.println(result);
}
public static int max(int[] arr) {
int result=arr[0];
for (int i=0;i<arr.length;i++) {
if (arr[i]>result) {
result=arr[i];
}
}
return result;
}
}
- 结果
4.求数组中平均值
- 代码
public class arrExercise {
public static void main(String[] args) {
int[] arr = {9,5,2,7,3,6,10};
double result=avg(arr);
System.out.println(result);
}
public static double avg(int[] arr) {
int sum=0;
for (int x:arr) {
sum+=x;
}
return (double )sum/(double)arr.length;
//不强制转换成double类型,这里就是int类型进行相除,会截断小数部分
}
}
- 结果
5.查找数组元素
查找有两种类型1.给定位置,查找值;2.给定值,查找位置(数组下标)
5.1给定值,查找位置(数组下标)
- 代码
public class arrExercise {
public static void main(String[] args) {
int[] arr = {9,5,2,7,3,6,10};
int pos=search(arr,3);
System.out.println(pos);
}
public static int search(int[] arr, int toSearch) {
for (int i=0;i<arr.length;i++) {
if (arr[i]==toSearch) {
return i;
}
}
return -1;
}
}
- 结果
5.2 给定值,查找位置 二分查找
普通查找的效率比较低,尤其在数组元素个数非常多的时候,但是二分查找只适用于有序的数组。
- 代码
public class test1220 {
public static void main(String[] args) {
//二分查找只适用于有序数组来使用
int[] arr={1,3,4,6,7,9,10,15,17};
int pos=binarySearch(arr,17);
System.out.println(pos);
}
//直接取整个数组的中间元素,和带查找元素进行对比
public static int binarySearch(int[] arr,int toSearch){
//创建一个带查找的区间[left,right]
int left=0;
int right=arr.length-1;
while (left<=right) {
int mid=(left+right)/2;
if(toSearch<arr[mid]){
//去左侧区间查找,淘汰到右侧区间
right=mid-1;
}else if(toSearch>arr[mid]){
//去右侧区间查找,淘汰掉左侧区间
left=mid+1;
}else {
//相等
return mid;
}
}
return 0;
}
}
- 结果
6 数组排序:冒泡排序
- 代码
import java.util.Arrays;
//冒泡排序:(升序来算)依次比较相邻的两个元素,一趟比较下来,
// 就能把最大的元素放到最后或者最小的元素放到最前。
public class test1220{
public static void main(String[] args) {
int[] arr={1,4,2,5,7,9,3,6};
bubbleSort(arr);
System.out.println(Arrays.toString(arr));
}
public static void bubbleSort(int[] arr) {
//如果从前往后遍历进行比较交换,就是把最大元素放最后
//如果从后往前遍历进行比较交换,就把最小元素放最前
for (int bound=0;bound< arr.length;bound++) {
for (int cur= arr.length-1;cur>bound;cur--) {
if (arr[cur-1]<arr[cur]) {
int temp=arr[cur-1];
arr[cur-1]=arr[cur];
arr[cur]=temp;
}
}
}
}
}
- 结果
7 数组逆序
- 代码
import java.util.Arrays;
public class test1220{
public static void main(String[] args) {
int[] arr={1,3,6,7,12,34};
reverse(arr);
System.out.println(Arrays.toString(arr));
}
public static void reverse(int[] a){
int left=0;
int right=a.length-1;
while (left<right){
//依次交换right和left的元素
int tmp=a[left];
a[left]=a[right];
a[right]=tmp;
left++;
right--;
}
}
}
- 结果
数组数字重排
- 代码
//数组重排,排列之后保证所有的偶数在后,奇数在前
import java.util.Arrays;
import java.util.Scanner;
public class test1220{
public static void main(String[] args) {
int[] arr={1,3,4,5,6,7,8,9};
transform(arr);
System.out.println(Arrays.toString(arr));
}
//从前往后找,找到一个奇数,再从后往前找,找到一个偶数,
// 交换这两个元素,直到这两个元素重合
public static void transform(int[] arr) {
int left=0;
int right=arr.length-1;
while (left > right) {
//从左往右找偶数
while (left < right && arr[left] % 2 != 0) {
left++;
}
//从右往左找到一个奇数
while (left < right && arr[right] % 2 ==0) {
right--;
}
//当这两循环结束之后,交换 left 和 right 的元素
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
}
}
}
- 结果