Java数组操作类
最近又重新在看慕课网的数据结构,然后把示例代码整理一下。
public class Array<E> {
private E[] data;
private int count = 0;
public Array(int length){
data = (E[]) new Object[length];
}
public Array(){
this(10);
}
/**
* 获取数组长度
* @return
*/
public int getLength(){
return data.length;
}
public int getCount(){
return count;
}
public boolean isEmpty(){
return count == 0;
}
/**
* 追加元素
* @param item
*/
public Array<E> add(E item){
return add(count, item);
}
/**
* 插入元素
* @param index 索引位置
* @param item 元素
*/
public Array<E> add(int index, E item){
//元素索引必须合法,则插入位置不能造成元素位置不连续
if(index < 0 || index > count) throw new IllegalArgumentException("Get failed Index is illegal.");
if(count == data.length){
resize((int) (data.length * 1.5));
}
//插入时,从尾部开始,每个元素后移动一位,直到当前索引位置为止
for(int i = count - 1; i >= index; i--){
data[i + 1] = data[i];
}
data[index] = item;
count++;
return this;
}
/**
* 获取元素
* @param index 索引,负数表示倒数
* @return
*/
public E get(int index){
if(index < 0) index += count;
if(index >= count) throw new IllegalArgumentException("Get failed Index is illegal.");
return data[index];
}
/**
* 修改元素
* @param index 索引,负数表示倒数
* @param item
*/
public Array<E> set(int index, E item){
if(index < 0) index += count;
if(index >= count) throw new IndexOutOfBoundsException();
data[index] = item;
return this;
}
/**
* 删除给定索引位置的元素
* @param index
* @return 元素
*/
public E remove(int index){
if(index < 0) index += count;
if(index >= count) throw new IndexOutOfBoundsException();
for(int i = index; i < count - 1; i++){
data[i] = data[i + 1];
}
count--;
data[count] = null;
//收缩容量
if(count == data.length / 4 && data.length / 2 > 0){
resize(data.length / 2);
}
return data[index];
}
/**
* 删除给定元素
* @param item
* @return
*/
public boolean remove(E item){
int index = find(item);
if(index >= 0){
remove(index);
return true;
}
return false;
}
/**
* 删除所有给定元素
* @param item
* @return boolean
*/
public boolean removeAll(E item){
int index = find(item);
if(index > -1){
do{
remove(index);
index = find(item);
}while(index <= 0);
return true;
}
return false;
}
/**
* 重新分配数组长度
* @param length
*/
private void resize(int length){
E[] data = (E[]) new Object[length];
for(int i = 0; i < count; i++){
data[i] = this.data[i];
}
this.data = data;
}
/**
* 判断元素是否存在
* @param item
* @return boolean
*/
public boolean contains(E item){
return (find(item) > -1)? true : false;
}
/**
* 查找元素所在位置
* @param item
* @return 索引位置
*/
public int find(E item){
for(int i = 0; i < count; i++){
//对象之间用 equals 方法,表示值比较
if(data[i].equals(item)) return i;
}
return -1;
}
@Override
public String toString(){
StringBuilder sb = new StringBuilder();
sb.append(String.format("Array[%d]: ", data.length, count));
sb.append('[');
for(int i = 0; i < count; i++){
sb.append(data[i]);
if(i != count - 1) sb.append(", ");
}
sb.append("]");
return sb.toString();
}
}
Java数组操作类的更多相关文章
- 菜鸡的Java笔记 实践 - java 数组操作
讲解一个继承的实现思路 要求定义一个数组操作类(Array类),在这个类里面可以进行整型数组的操作,由外部传入数组的大小 ,并且要求实现数据的保存以及数据的 ...
- JAVA文件操作类和文件夹的操作代码示例
JAVA文件操作类和文件夹的操作代码实例,包括读取文本文件内容, 新建目录,多级目录创建,新建文件,有编码方式的文件创建, 删除文件,删除文件夹,删除指定文件夹下所有文件, 复制单个文件,复制整个文件 ...
- Java数组操作的10大方法
转载自码农网 译文链接:http://www.codeceo.com/article/10-java-array-method.html 英文原文:Top 10 Methods for Java Ar ...
- Java文件操作类效率对比
前言 众所周知,Java中有多种针对文件的操作类,以面向字节流和字符流可分为两大类,这里以写入为例: 面向字节流的:FileOutputStream 和 BufferedOutputStream 面向 ...
- 并发库应用之二 & Java原子性操作类应用
Java5的线程并发库中,提供了一组atomic class来帮助我们简化同步处理.基本工作原理是使用了同步synchronized的方法实现了对一个long, integer, 对象的增.减.赋值( ...
- Java 数学操作类
数学操作类 Math类 数学计算操作类 类属性值 Math.E ^ Math.PI 圆周率 类方法 Math类中,一切方法都是 static 型,因为Math类中没有普通属性. round() 方法 ...
- Java大数操作类
Java的大数操作分为BigInteger和BigDecimal,但这两给类是分开使用的,有时候在编程的时候显得略微繁琐,现在编写了一个将二者合二为一的大数操作类. 大数操作类代码如下: packag ...
- php 数组操作类(整合 给意见)
数组操作函数整理: /* 将一个二维数组按照指定字段的值分组 * * @param array $arr * @param string $keyField * * @return array */ ...
- Java数组操作十大方法 (转)
定义一个Java数组 String[] aArray = new String[5]; String[] bArray = {"a","b","c&q ...
随机推荐
- js字符串转换为JSON
1. json字符串 jsStr = “{"a":'xxx', "b":'yyy'}” JSON.parse(jsStr); //可以将json字符串转换成j ...
- yugabyte 安装pg extention
前段时间在学习yugabyte 发现yugabyte 是直接复用了pg server的源码,所以当时就觉得大部分pg extension 也是可用. 今天看到了官方文档中有关于如何安装的,发现还得多看 ...
- java stackoverflowerror与outofmemoryerror区别
1.stackoverflow: 每当java程序启动一个新的线程时,java虚拟机会为他分配一个栈,java栈以帧为单位保持线程运行状态:当线程调用一个方法是,jvm压入一个新的栈帧到这个线程的栈中 ...
- (转载)如何在当前目录下快速打开cmd
很多时候我们需要打开命令行然后进入到相应目录进行一些操作. 常规的做法是: Win+R打开运行窗口 输入"cmd"回车打开命令行窗口 假如我们要进入的是D盘foo文件夹下的一个ba ...
- Redis(一) 数据结构与底层存储 & 事务 & 持久化 & lua
参考文档:redis持久化:http://blog.csdn.net/freebird_lb/article/details/7778981 https://blog.csdn.net/jy69240 ...
- JavaScript初探系列(九)——BOM
一.什么是BOM? BOM:Browser Object Model 是浏览器对象模型,浏览器对象模型提供了独立与内容的.可以与浏览器窗口进行互动的对象结构,BOM由多个对象构成,其中代表浏览器窗口的 ...
- Java 内存排查,慢慢收集总结
Java堆外内存排查小结: https://mp.weixin.qq.com/s?__biz=MzA4MTc4NTUxNQ==&mid=2650518612&idx=2&sn= ...
- element UI中的select选择器的change方法需要传递多个值
如果直接调用change事件,不传任何参数,则可以获取到当前选中的值(因为默认会将event参数传递过去) 场景: 你需要将select选择器 ”选中的当前元素“ 和 ”其他你需要的值“ 一起传递过去 ...
- 目前流行前端几大UI框架排行榜
在前端项目开发过程中,总是会引入一些UI框架,已为方便自己的使用,很多大公司都有自己的一套UI框架,下面就是最近经常使用并且很流行的UI框架. 一.Mint UI 流行指数:★★★★ Mint UI是 ...
- 从ASP.NET到ASP.NET Core差异变化
MSDN原文:链接 ASP.NET Core项目为开发人员提供了针对.NET Core,.NET Framework2种实现方式,根据官网通告NETCORE3.0后将取消对.NET Framework ...