博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java数据结构和算法-1-数组-自定义封装一个数组操作类(1)
阅读量:4302 次
发布时间:2019-05-27

本文共 4115 字,大约阅读时间需要 13 分钟。

       突然感觉好久没有学习Java和写Java代码了,工作中使用的Groovy来源其实大部分和Java是一样,有时比Java风格要简写。对于很多初级程序员来说,不管什么开发写代码,关于数组,字符串的处理,肯定是最多的。这个系列,我来学习下Java中的数据结构和算法课程。有时候,面试看到了什么二叉树,红黑树,完全不知道是什么鬼,希望学习了这个课程之后,能掌握基本的,或者能够用在面试上面。

 

       数组是学习数据结构和算法的基础,所以,我们需要花大量时间去弄懂数组和和数组的常用方法,甚至有些方法是需要我们去看源代码是如何实现的。关于数组,我们先复习下曾经在Java SE中的知识。

1、如何创建数组

package array;public class TestArray {   public static void main(String[] args) {          // 创建数组格式: 类型[] 数组名称 = new 类型[初始大小]          int[] arr = new int[10];       }}

       创建数组之前,需要想好数组的类型,是int还是long还是String,还需要给数组起一个名字,例如arr,使用关键字new来创建数组对象,而且需要指定数组的初始大小,例如上面10,表示这个数组最多有10个元素。

 

2、访问数组中数据项

        数组的数据项也叫数组中的元素,是通过元素的索引来查找元素。数字0表示第一个元素,数字1表示第二个元素,数字-1表示最后一个元素,数字-2表示倒数第二个元素。

package array;public class TestArray {    public static void main(String[] args) {	// 创建数组格式: 类型[] 数组名称 = new 类型[初始大小]        int[] arr = new int[10];        // 访问数组的数据项        arr[0] = 1;        System.out.println(arr[0]);    }}

 

3、数组的初始化

       前面我们只是初始化了数组的大小,并没有对数据项初始化。如果想在声明数组的时候并初始化数组内容,需要如下做,并不需要给出数组大小。

package array;public class TestArray {   public static void main(String[] args) {      int[] arr = new int[]{1,2,3,4,5};      System.out.println(arr[2]);   }}

 

4、经典的数组下标越界异常

       在上面部分,我们初始化了数组,里面有{1,2,3,4,5}五个元素,如果我们想访问arr[5],这个时候就会报错:java.lang.ArrayIndexOutOfBoundsException

因为,元素下标是从数字0开始,而arr[6]是访问第六个元素,但是数组只有五个元素,所以报数组索引越界异常。

 

5、创建一个MyArray自定义封装数组方法类

package array;public class MyArray {   private long[] arr;   // 表示有效元素的长度   private int elements;   public MyArray() {      arr = new long[50];   }   public MyArray(int maxsize) {      arr = new long[maxsize];   }}

这个封装的类,写了一个属性,数组的元素大小,还写了两个构造方法,一个是无参数构造,默认元素大小是50,第二个是有参数构造,支持传进来的元素大小为参数。

 

6、添加类方法(数组操作)

我们先来添加数据方法和打印整个数组内容的方法,第二个打印方法需要掌握并能写出来。

package array;public class MyArray {   private long[] arr;   // 表示有效元素的长度   private int elements;   public MyArray() {      arr = new long[10];   }   public MyArray(int maxsize) {      arr = new long[maxsize];   }   /**    * 添加数据    */   public void insert(long value) {      arr[elements] = value;      elements++;   }   /**    * 打印数组内容    */   public void print() {      System.out.print("[");      for (int i = 0; i < elements; i++) {        System.out.print(arr[i] + " ");      }      System.out.println("]");   }}

测试类代码

package array;public class TestMyArray {   public static void main(String[] args) {      MyArray arr = new MyArray(3);      arr.insert(13);      arr.insert(24);      arr.insert(96);      arr.print();   }}

第一个方法insert()中,为什么要使用arr[elements]=value,然后elements++, 因为elements这个类属性,没有进行初始化,默认的值就是0,第一个添加元素进入数组,这个元素的索引就是0,第二次添加元素索引就是1,所以elements要自增。

 

第二个方法,这个方法可能在面试中会遇到,算是比较简单的送分题。一般题目会要求你使用自己的方法去打印数组内容,而且明确指出不能用JDK自带的API去实现。这个方法注意换行就是,还有最后一个元素后面空格,我们可以再次进行优化。

public void print() {      System.out.print("[");      for (int i = 0; i < elements; i++) {        if(i == elements - 1) {           System.out.print(arr[i]);        }else {           System.out.print(arr[i] + " ");        }      }      System.out.println("]");   }

增加根据元素值找索引方法。

/**	 * 元素查找,根据value查key	 */	public int search (long value) {		int i;		for (i = 0; i < elements; i++) {			if(value == arr[i]) {				break; // 找到了就不再查了			}		}				//做判断,考虑查不到就返回-1		if(i == elements) {			return -1;		}else {			return i;		}	}

测试代码

package array;public class TestMyArray {	public static void main(String[] args) {		MyArray arr = new MyArray(3);		arr.insert(13);		arr.insert(24);		arr.insert(96);        		arr.print();		System.out.println(arr.search(96));		System.out.println(arr.search(102));	}}

运行结果:

[13 24 96]2-1

添加根据索引查找元素值方法

/**	 * 查找元素:根据元素索引查找值,需要考虑索引越界异常	 */	public long search(int index) {		if(index >= elements || index < 0) {			throw new ArrayIndexOutOfBoundsException();		} else {			return arr[index];		}	}

下面来测试一下

package array;public class TestMyArray {	public static void main(String[] args) {		MyArray arr = new MyArray(3);		arr.insert(13);		arr.insert(24);		arr.insert(96);        		arr.print();		System.out.println(arr.search(2));		System.out.println(arr.search(3));	}}

运行结果:

[13 24 96]96Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException	at array.MyArray.search(MyArray.java:63)	at array.TestMyArray.main(TestMyArray.java:13)

下一篇,继续学习这个数组类封装其他的操作方法。

 

转载地址:http://pkows.baihongyu.com/

你可能感兴趣的文章
深度神经网络总结
查看>>
Tensorflow论文学习
查看>>
大数据技术总结
查看>>
云计算技术总结
查看>>
C/C++内存申请函数总结
查看>>
c++文件读写坑总结
查看>>
Java递归删除文件
查看>>
流 java 流 字符流 字节 流的学习与理解
查看>>
《六顶思考帽》读书笔记
查看>>
《你的灯亮着吗》第一遍读后感
查看>>
Python实现冒泡排序算法
查看>>
《系统思考实践篇》知识点框架总结
查看>>
KMP算法研究
查看>>
修改Linux中的rm命令防止误删除操作
查看>>
谈谈关于网瘾的看法和建议
查看>>
C含参数的宏与函数的区别
查看>>
memcpy原码引发的内存拷贝注意事项
查看>>
单工、半双工、全双工的区别
查看>>
LDO是什么?LDO与DCDC的区别与选择
查看>>
FTP和TFTP的区别
查看>>