Java中数组的定义和使用教程(三)

 更新时间:2021年1月15日 12:46  点击:2251

数组排序

在很多的面试题上都会出现数组排序的操作形式。但是这个时候你千万别写上: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数组的定义和使用内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!

[!--infotagslink--]

相关文章

  • Java实现经典游戏复杂迷宫

    这篇文章主要介绍了如何利用java语言实现经典《复杂迷宫》游戏,文中采用了swing技术进行了界面化处理,感兴趣的小伙伴可以动手试一试...2022-02-01
  • php中eval()函数操作数组的方法

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • java 运行报错has been compiled by a more recent version of the Java Runtime

    java 运行报错has been compiled by a more recent version of the Java Runtime (class file version 54.0)...2021-04-01
  • 在java中获取List集合中最大的日期时间操作

    这篇文章主要介绍了在java中获取List集合中最大的日期时间操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
  • Python 图片转数组,二进制互转操作

    这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
  • 教你怎么用Java获取国家法定节假日

    这篇文章主要介绍了教你怎么用Java获取国家法定节假日,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下...2021-04-23
  • Java如何发起http请求的实现(GET/POST)

    这篇文章主要介绍了Java如何发起http请求的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-31
  • C#创建自定义控件及添加自定义属性和事件使用实例详解

    这篇文章主要给大家介绍了关于C#创建自定义控件及添加自定义属性和事件使用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-06-25
  • php数组操作 键名比较 差集 交集赋值

    本文章提供在量的数据中级操作实例有如对键名比较计算数组的差集 计算差集 给指定数组中插入一个元素 反转数组 交集赋值新的数组实例。 //定义回调函数 funct...2016-11-25
  • C#二维数组基本用法实例

    这篇文章主要介绍了C#二维数组基本用法,以实例形式分析了C#中二维数组的定义、初始化、遍历及打印等用法,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • 浅谈Java与C#的一些细微差别

    说起C#和Java这两门语言(语法,数据类型 等),个人以为,大概有90%以上的相似,甚至可以认为几乎一样。但是在工作中,我也发现了一些细微的差别...2020-06-25
  • C#数组的常用操作方法小结

    Array数组在C#中同样是最基本的数据结构,下面为大家C#数组的常用操作方法小结,皆为细小的代码段,欢迎收看收藏...2020-06-25
  • JS实现自定义简单网页软键盘效果代码

    本文实例讲述了JS实现自定义简单网页软键盘效果。分享给大家供大家参考,具体如下:这是一款自定义的简单点的网页软键盘,没有使用任何控件,仅是为了练习JavaScript编写水平,安全性方面没有过多考虑,有顾虑的可以不用,目的是学...2015-11-08
  • php curl模拟post请求和提交多维数组的示例代码

    下面一段代码给大家介绍php curl模拟post请求的示例代码,具体代码如下: <&#63;php$uri = "http://www.cnblogs.com/test.php";//这里换成自己的服务器的地址// 参数数组$data = array ( 'name' => 'tanteng'// 'passwor...2015-11-24
  • 解决Java处理HTTP请求超时的问题

    这篇文章主要介绍了解决Java处理HTTP请求超时的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-29
  • android自定义动态设置Button样式【很常用】

    为了增强android应用的用户体验,我们可以在一些Button按钮上自定义动态的设置一些样式,比如交互时改变字体、颜色、背景图等。 今天来看一个通过重写Button来动态实...2016-09-20
  • java 判断两个时间段是否重叠的案例

    这篇文章主要介绍了java 判断两个时间段是否重叠的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
  • C# 拷贝数组的几种方法(总结)

    下面小编就为大家带来一篇C# 拷贝数组的几种方法(总结)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • 超简洁java实现双色球若干注随机号码生成(实例代码)

    这篇文章主要介绍了超简洁java实现双色球若干注随机号码生成(实例代码),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-04-02
  • PHP 二维数组根据某个字段排序的具体实现

    本文记录的要实现的功能类似于 MySQL 中的 ORDER BY,上个项目中有遇到这样的一个需求。 要求:从两个不同的表中获取各自的4条数据,然后整合(array_merge)成一个数组,再根据数据的创建时间降序排序取前4条。 遇到这个...2014-06-07