Java在固定长度的数组里加入一个数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java在固定长度的数组里加入一个数相关的知识,希望对你有一定的参考价值。
比如定义了一个数组a[9],输入了9个数进去,把它们排序了,现在又想添加一个数进去,但是报错,说溢出,如何解决?
题目:给定一个有序的数组13, 15, 19, 28, 33, 45, 78, 106,如果往该数组中存储一个元素,并保证这个数组还是有序的,那么这个元素的存储的角标如何获取?并打印出插入后的数组packagecom.ljy.interviewQuestion;
/**
* 题目:给定一个有序的数组13, 15, 19, 28, 33, 45, 78, 106,
* 如果往该数组中存储一个元素50,并保证这个数组还是有序的,
* 那么这个元素的存储的角标如何获取?
* 思路:利用二分查找法,将最后返回min值即可。
* 步骤: 1)定义arr,key来存储题目中的值,定义max,min和mid来分别记录二分区间
* 2)使用while循环结构来控制,循环条件为 min <= max,否则返回min
* @author liaojianya
* 2016-11-16
*/
publicclass InsertOrderedArr
publicstaticvoid main(String[] args)
int[] arr = newint[] 13, 15, 19, 28, 33, 45, 78, 106;
int key = 50;
int index = getInsertIndex(arr, key);
System.out.println(key + "应该插入到数组的位置下标为: " + index);
int[] arr1 = newint[arr.length + 1];
insertArr(arr, arr1, key, index);
printArr(arr1);
//打印数组
privatestaticvoid printArr(int[] arr1)
System.out.print("插入元素后的数组为: [");
for(int i = 0; i < arr1.length; i++)
if(i != arr1.length - 1)
System.out.print(arr1[i] + ", ");
else
System.out.println(arr1[i] + "]");
publicstaticint getInsertIndex(int[] arr, int key)
int min = 0;
int max = arr.length - 1;
while(min <= max)
//右移折半
int mid = (min + max) >> 1;
//如果key值比中间值大,则所要插入位置在数组的右半边
if(key > arr[mid])
min = mid + 1;
//如果key值比中间值小,则所要插入位置在数组的左半边
elseif(key < arr[mid])
max = mid - 1;
//key值和中间值一样大,则直接返回index = mid
else
return mid;
//如果下标min > max,则返回min位置即为所要插入的位置
return min;
/*
* 步骤:
* 循环遍历arr,如果i < index,则arr1[i] = arr[i];
* 如果i == index,则arr1[i] = key;
* 否则,arr1[i] = arr[i-1];
*
*/
publicstaticvoid insertArr(int[] arr, int[] arr1, int key, int index)
for(int i = 0; i < arr1.length; i++)
if (i < index)
arr1[i] = arr[i];
elseif(i == index)
arr1[i] = key;
else
arr1[i] = arr[i-1];
程序输出:
用不定长的数组直接初始化那些数组元素,上面我举例说明了一下,希望能够帮到楼主~望采纳~~~
可不可以把代码写个例子出来,麻烦你了。
参考技术B 数组一但定义好之后,长度是不能修改的,除非你用另一个长一点的数组去替换掉。int[] a = 1, 2, 3, 4, 5 ;
System.out.println(a[4]);
a = org.apache.commons.lang.ArrayUtils.add(a, 6);
System.out.println(a[5]);追问
我把a = org.apache.commons.lang.ArrayUtils.add(a, 6);复制到我的码里面,org.apache报错,a = org.apache.commons.lang.ArrayUtils.add(a, 6);是什么意思啊?
追答org.apache.commons.lang.ArrayUtils.add(a, 6);
这个的意思就是在a中添加一个值为6的元素,并返回一个新的数组。ArrayUtils这个类是在common-lang这个jar包里面的,如果你没有的话,可以换种方式:
int[] a = 1, 2, 3, 4, 5 ; //原数组,长度为5
int[] b = new int[a.length + 1]; //新数组,长度为a的长度+1
System.arraycopy(a, 0, b, 0, 5); //复制数组,把a复制到b。参数分别为:源数组、源数组开始位置、目标数组、目标数组开始位置、元素个数
b[a.length] = 6;
System.out.println(b[a.length]);
第十一章 集合框架
想要存储多个对象我们学习过的可以使用数组,但是如果存储的对象个数会不断变化的话,用数组就不合适了.因为数组存储的数组是定长的.
所以java中提供了集合类,让我们更方便的存储变长个数的对象.
集合和数组的最大区别是:
数组的长度是固定的,但集合的长度是可变的.
数组只能存储相同类型的数据,而集合能够存储不同类型的数据.
集合按照存储结构可以分成俩类:
1、Collection单列集合:用于存储一系列符合某种规则的元素
子接口:List、Set.
List中可以有重复的元素,并且List类中带有索引,可以通过索引精确得操作集合中的元素
2、Map双列集合:用于存储有映射关系的数据,有主键关系,就像是Python的字典.
子接口:HashMap、TreeMap
Collection接口:
是所有单列集合类的父接口,有一些单列集合(List 、Set)通用的方法:
用于增加数据:
add(E e):添加成功返回True,失败返回False
addAll(Collection c) 将参数集合中的元素添加到调用对象集合中.
用于删除数据:
clear():移除集合所有的元素
remove(Object o):删除集合中指定的元素
removeAll(Collection o):删除调用集合中的o集合中的所有元素
retainAll(Collection o):保留调用集合中与集合o中元素相同的元素,其他全部删除
用于查看:
size() :查看集合元素的个数
用于判断:
isEmpty():判断集合是否为空
contains(Object o):判断调用集合元素中是否有o对象
containsAll(Collection c):判断集合中是否存在有c集合
Collection的子接口:List类
常用方法:
用于增加:
void add(int index,E element):将E元素添加到集合的index位置
boolean addAll(int index,Collection c):将集合c中的元素添加到调用集合的index处,如果失败会返回false,成功会返回true
用于获取:
Object get(int index):获取调用集合中index位置的元素
indexOf(Object o):获取调用集合中对象中o对象出现的位置索引值
lastIndexOf(Object o):获取调用集合对象中o对象最后一次出现的位置索引值
List subList(int fromIndex,int toIndex):返回调用集合中位置索引值为fromIndex到toIndex值的所有元素,返回值为集合.
用于修改:
set(int index,E element) 将索引值为index的元素替换成element对象,并将替换后的元素返回.
List接口有俩个常用实现类,
ArrayList
当ArrayList的容量不够时,会自动增长为原来的1.5倍.在内存空间的地址是连续的,所以ArrayList数据查找速度快,但是增删数据慢.
ArrayList的大多数常用方法都是从Collection和List那继承来的,就不再介绍了.
LinkedList
LinkedList和ArrayList相反,虽然查询速度慢,但是增加和删除元素快,因为LinkedList类底层是用链表来实现的,
每次查找元素需要从头往下找.
常用方法:
void addFirst(Object o) :将指定元素插入到此列表的开头
void addLast(Object o):将制定元素插入到此列表的结尾
Object getFirst():获取列表第一个元素
Object getLast():获取列表最后一个元素
Object removeFirst():移除并返回此列表的第一个元素
Object removeLast():移除并返回此列表的最后一个元素
Iterator迭代器
为了方便处理集合中的元素,提供了一些方法来处理集合中的元素.
就是Iterator了
Iterato迭代器获取:(使用集合自带的iterator方法)
Iterator i=集合对象.iterator();//获得自身的迭代器
常用方法:
boolean hasNext() :检查是否还有元素可以迭代,如果有则返回true,无返回false
next() :返回迭代的下一个元素
remove():删除迭代器返回的最后一个元素,从Iterator指向的collection中.
Iterator常与while语句配合使用:
while(iterator.hasNext()) { System.out.println(itrator.next()); }
Collection的另一个子接口:Set
Set与List不同的是:Set存储数据是无序的,并且存入的数据是不可重复的(按照某种规则)
Set有俩个实现类:
HashSet:根据对象的哈希码值来确定元素在集合中的存储位置,所以具有良好的存取和查询能力
TreeSet:已二叉树的方式来存储元素,他可以实现对集合中的元素进行排序.
以上是关于Java在固定长度的数组里加入一个数的主要内容,如果未能解决你的问题,请参考以下文章