在很多的面试题上都会出现数组排序的操作形式。但是这个时候你千万别写上: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; } }
但是这些都是属于数据结构课程的范围,是逻辑思维训练。
在之前所定义的数组都属于基本数据类型数组,那么对象也可以将其定义为数组,这样的操作形式称为对象数组。对象数组往往是以引用数据类型为主的定义,例如:类、接口,而且对象数组也分为两种定义格式。
范例: 对象数组的动态初始化
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中数组的定义及使用方法(推荐),包括了java中数组的定义及使用方法(推荐)的使用技巧和注意事项,需要的朋友参考一下 数组:是一组相关变量的集合 数组是一组相关数据的集合,一个数组实际上就是一连串的变量,数组按照使用可以分为一维数组、二维数组、多维数组 数据的有点 不使用数组定义100个整形变量:int i1;int i2;int i3 使用数组定义 int i[100];
我一直在经历为JasperSoft开发自定义QRCode组件的过程。本文解释了如何在iReport设计器中执行此操作。但是我想知道如何让文章描述的QRCode组件在Jaspersoft工作室中工作。 有没有一个可以与Jaspersoft Studio一起使用的自定义组件的例子?我正在寻找源代码或教程的链接。还没有找到关于Jaspersoft工作室的具体信息。
本文向大家介绍javascript中数组的定义及使用实例,包括了javascript中数组的定义及使用实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了javascript中数组的定义及使用方法。分享给大家供大家参考。具体分析如下: 希望本文所述对大家的javascript程序设计有所帮助。
问题内容: 为什么无论什么变量成立,它总是返回?即使使用clank搜索变量,它也会返回相同的结果。我错过了什么吗? 我的数组包含逗号分隔的值,我想在数组元素中的逗号之前基于字符串进行搜索。还有其他简单的解决方案吗?我还制作了一个自定义方法,该方法可以遍历数组并找到字符串,但是我正在寻找其他选择。 问题答案: JavaDoc on 声明必须已对数组进行排序,因此比较器实际上将数组值与搜索字符串进行比
本文向大家介绍C语言中函数的声明、定义及使用的入门教程,包括了C语言中函数的声明、定义及使用的入门教程的使用技巧和注意事项,需要的朋友参考一下 对函数的“定义”和“声明”不是一回事。函数的定义是指对函数功能的确立,包括指定函数名,函数值类型、形参及其类型以及函数体等,它是一个完整的、独立的函数单位。而函数的声明的作用则是把函数的名字,函数类型以及形参的类型、个数和顺序通知编译系统,以便在调用该函数
本文向大家介绍javascript 数组的定义和数组的长度,包括了javascript 数组的定义和数组的长度的使用技巧和注意事项,需要的朋友参考一下 本文提供一款简单的js入门教程,这是一款js数组定义与数组长度实例教程,如果你正在学习js数组的话,我们这里告诉你如何定义数组以及增加数组与数组长度计算实例。 先来看看如何定义数组 或者数组直接量: 下面看一下,在数组后面增加一个元素 数组的长度