Java中数组的定义和使用教程(三)
作者:mrbacker 发布时间:2023-08-26 20:03:16
数组排序
在很多的面试题上都会出现数组排序的操作形式。但是这个时候你千万别写上: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());
}
}
}
每一个对象可以保存更多的的属性,所以对象数组保存的内容要比基本数据类型更多。那么应用的也就更多。所有的开发必定都存在有对象数组的概念。
总结
来源:https://blog.csdn.net/mrbacker/article/details/82319021


猜你喜欢
- //可以包括其他字符 public string uncode(string str) { string outStr = "&q
- 1. 简单说明嗨,大家好!今天给大家分享的是Mybatis-plus 插件的分页机制,说起分页机制,相信我们程序员都不陌生,今天,我就给大家
- 像360卫士的波浪球进度的效果,一般最常用的方法就是画线的方式,先绘sin线或贝塞尔曲线,然后从左到右绘制竖线,然后再裁剪圆区域。今天我这用
- Android 检测键盘是否显示及隐藏键盘的方法~~ A
- ProgressBar有2个子控件:SeekBar 拖动条控件RatingBar 星级评分控
- 本文实例讲述了Android编程基于重力传感器实现横竖屏放向切换功能。分享给大家供大家参考,具体如下:最近项目中用到了vr视频播放,因为自己
- 本文实例为大家分享了Java通过JavaMail发送邮件的具体代码,供大家参考,具体内容如下这里我用的是SpringBoot项目1、引入相关
- using System;using System.Drawing;namespace PubLib{ /// <summa
- 快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。步骤为:1.从数
- 本文实例讲述了Java实现求数组最长子序列算法。分享给大家供大家参考,具体如下:问题:给定一个长度为N的数组,找出一个最长的单调自增子序列(
- 这篇文章主要介绍了Java实现顺序栈原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考
- volatile关键字相信了解Java多线程的读者都很清楚它的作用。volatile关键字用于声明简单类型变量,如int、float、boo
- 如果对空的对象进行操作,就会造成意外错误。所以我们在使用对象前,一般会进行非空判断接下来介绍我知道的三种判断非空方法:1、if判断这个最直接
- 本文实例讲述了C#接口interface用法。分享给大家供大家参考。具体如下:using System;//example of inter
- 前言碎语今天博主安利一个国产开源的无服务器容器云平台,关注它已经有一年多了,虽然其迭代到现在很多功能还是一直处于测试验证中,但是其设计理念以
- 摘要空指针异常(NullPointerException)可以说是Java程序员最容易遇到的问题了,影响说大不大,说小也不小。为了解决这个问
- 本文实例讲述了C#使用回溯法解决背包问题的方法。分享给大家供大家参考。具体如下:背包问题描述:给定一组物品,每种物品都有自己的重量和价格,在
- 本文实例讲述了C#执行SQL事务用法。分享给大家供大家参考。具体分析如下:1.通过存储过程。2.通过C#中提供的Transaction。这里
- 在我们工作中涉及到一些场景需要我们配置多数据源的操作,之前来说我们配置数据源需要写繁琐的配置类来配置我们的数据源,哪个是默认数据源等等,而现
- 这几天一直都在捣鼓android的知识点,兴趣班的老师,讲课太过深奥,天(想到什么就见什么,后后面完全不想听),最后自己找资料总结了在And