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];
            
        
    

程序输出:

用不定长的数组直接初始化那些数组元素,上面我举例说明了一下,希望能够帮到楼主~望采纳~~~

参考技术A 先把数组长度读取出来,然后在增加一个,然后就可以把数增加进去了。追问

可不可以把代码写个例子出来,麻烦你了。

参考技术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在固定长度的数组里加入一个数的主要内容,如果未能解决你的问题,请参考以下文章

N组相同固定长度字符数组成员统计 C/C++语言实现

在java中,一个数组的长度不固定(长度大于1),如何获取数组的最后一个元素

如何将一个数组拆分成多个固定长度的数组

Java集合类的使用

Java中数组的概念与特点

java面向对象中的集合