Java中数组的定义和使用教程(三)
数组排序
在很多的面试题上都会出现数组排序的操作形式。但是这个时候你千万别写上:java.util.Arrays.sort(数组)。而这种排序都是以升序为主。
基础的排序操作:
范例: 冒泡排序
public class ArrayDemo { public static void main(String args[]) { int data[] = new int[] {9, 3, 1, 5, 4, 2, 7, 8, 6, 0}; sort(data); printArray(data); } public static void sort(int arr[]) { //实现数组排序 for(int x = 0; x < arr.length - 1; x++) { for(int y = 0; y < arr.length - x - 1; y++) { if(arr[y] > arr[y+1]) { int temp = arr[y]; arr[y] = arr[y+1]; arr[y+1] = temp; } } } } //定义一个专门进行数组输出的方法 public static void printArray(int temp[]) { for (int i = 0; i < temp.length; i++) { System.out.print(temp[i] + "、"); } System.out.println(); } }
数组转置
所谓的转置最简单的理解就是首尾交换。而如果要想实现这样的交换有两种实现思路。
思路一:开辟一个新的等长的数组,而后将原始数组倒序保存进去;
public class ArrayDemo { public static void main(String args[]) { int data[] = new int[] {9, 3, 1, 5, 4, 2, 7, 8, 6, 0}; data = reverse(data); //反转 printArray(data); } public static int [] reverse(int arr[]) { int temp[] = new int[arr.length]; int foot = 0; for(int x = arr.length - 1; x >= 0; x--) { temp[foot++] = arr[x]; } return temp; } //定义一个专门进行数组输出的方法 public static void printArray(int temp[]) { for (int i = 0; i < temp.length; i++) { System.out.print(temp[i] + "、"); } System.out.println(); } }
使用此类模式实现的最大问题在于开辟了两块相同的堆内存空间,所以造成空间浪费。
思路二:在一个数组上完成转换
public class ArrayDemo { public static void main(String args[]) { int data[] = new int[] {9, 3, 1, 5, 4, 2, 7, 8, 6, 0}; reverse(data); //反转 printArray(data); } public static void reverse(int arr[]) { int center = arr.length / 2; //转换次数 int head = 0; //头部开始索引 int tail = arr.length - 1; //尾部开始索引 for(int x = 0; x < center; x++) { int temp = arr[head]; arr[head] = arr[tail]; arr[tail] = temp; head++; tail--; } } //定义一个专门进行数组输出的方法 public static void printArray(int temp[]) { for (int i = 0; i < temp.length; i++) { System.out.print(temp[i] + "、"); } System.out.println(); } }
这种转换只需要根据数组长度 ÷ 2即可。
如果要进行二维数组的原地转置,那么肯定有一个前提:行列要相等。
范例: 保证中间轴不变(x = y)
public class ArrayDemo { public static void main(String args[]) { int data[][] = new int[][] {{1, 2, 3}, {4, 5, 6},{7, 8, 9}}; reverse(data); //反转 printArray(data); } public static void reverse(int arr[][]) { for(int x = 0; x < arr.length; x++) { for(int y = x; y < arr[x].length; y++) { if(x != y) { int temp = arr[x][y]; arr[x][y] = arr[y][x]; arr[y][x] = temp; } } } } //定义一个专门进行数组输出的方法 public static void printArray(int temp[][]) { for (int i = 0; i < temp.length; i++) { for(int j = 0; j < temp[i].length; j++) { System.out.print(temp[i][j] + "、"); } System.out.println(); } System.out.println(); } }
二分查找法
如果现在要求在一个指定的数组之中查询一个数据的位置,那么现在可能想到的最简化的实现,整体数组遍历。
范例: 顺序查找
public class ArrayDemo { public static void main(String args[]) { int data[] = new int[] {1, 2, 3, 4, 5, 6, 7, 8}; int search = 7; System.out.println(index(data, search)); } public static int index(int arr[], int key) { for(int x = 0; x < arr.length; x++) { if(arr[x] == key) return x; } return -1; } }
这个的时间复杂度是n,也就是说所有的数组中的数据都需要进行一次遍历,这样才能确认所需要查找的数据是否存在,那么现在如果想进行更快速地查找,最好的做法是进行二分查找(折半查找)。
范例: 实现二分查找(采用递归)
public class ArrayDemo { public static void main(String args[]) { int data[] = new int[] {1, 2, 3, 4, 5, 6, 7, 8}; int search = 7; System.out.println(index(data, search)); } public static int binarySearch(int arr[], int from, int to, int key) { if(from < to) { int mid = from / 2 + to / 2; //确定中间点 if(arr[mid] = key) { //数据找到了 return mid; // 取得当前索引 }else if(key < arr[mid]) { return binarySearch(arr, from, mid - 1; key); } else(key > arr[mid]){ return binarySearch(arr, mid + 1, to, key); } } return -1; } }
但是这些都是属于数据结构课程的范围,是逻辑思维训练。
对象数组(核心)
在之前所定义的数组都属于基本数据类型数组,那么对象也可以将其定义为数组,这样的操作形式称为对象数组。对象数组往往是以引用数据类型为主的定义,例如:类、接口,而且对象数组也分为两种定义格式。
- 对象数组动态初始化:类名称 对象数组名称[] = new 类名称[长度];
- 对象数组静态初始化:类名称 对象数组名称[] = new 类名称[]{实例化对象,…};
范例: 对象数组的动态初始化
class Person { private String name; private int age; public Person(String n, int a) { name = n; age = a; } public String getInfo() { return "姓名:" + name + ",年龄:" + age; } } public class ArrayDemo { // 动态初始化之后对象数组中的每一个元素都是其对象数据类型的默认值 public static void main(String args[]) { Person per[] = new Person[3]; //动态初始化 per[0] = new Person("张三", 1); per[1] = new Person("王五", 2); per[2] = new Person("李四", 4); for(int x = 0; x < per.length; x++) { System.out.println(per[x].getInfo()); } } }
范例: 静态初始化
class Person { private String name; private int age; public Person(String n, int a) { name = n; age = a; } public String getInfo() { return "姓名:" + name + ",年龄:" + age; } } public class ArrayDemo { // 动态初始化之后对象数组中的每一个元素都是其对象数据类型的默认值 public static void main(String args[]) { Person per[] = new Person[] { new Person("张三", 1), new Person("王五", 2), new Person("李四", 4) }; //动态初始化 for(int x = 0; x < per.length; x++) { System.out.println(per[x].getInfo()); } } }
每一个对象可以保存更多的的属性,所以对象数组保存的内容要比基本数据类型更多。那么应用的也就更多。所有的开发必定都存在有对象数组的概念。
总结
到此这篇关于Java中数组的定义和使用的文章就介绍到这了,更多相关Java数组的定义和使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
java静态工具类注入service出现NullPointerException异常处理
如果我们要在我们自己封装的Utils工具类中或者非controller普通类中使用@Autowired注解注入Service或者Mapper接口,直接注入是报错的,因Utils用了静态方法,我们无法直接用非静态接口的,遇到这问题,我们要想法解决,下面小编就简单介绍解决办法,需要的朋友可参考下2021-09-09解决spring懒加载以及@PostConstruct结合的坑
这篇文章主要介绍了解决spring懒加载以及@PostConstruct结合的坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-12-12java.util.concurrent.ExecutionException 问题解决方法
这篇文章主要介绍了java.util.concurrent.ExecutionException 问题解决方法的相关资料,需要的朋友可以参考下2016-11-11
最新评论