insert 数组_图解数据类型:数组背后的故事

今天,我们一起来了解数据类型——数组背后的故事吧~~

ps,想学python或者java的小伙伴,不要错过后面有彩蛋哟。

数组(array)概念:

是数据的一种组织形式。是有限个相同类型变量所组成的有序集合。

概念是最重要的,把握两个词:有限个,相同。

说明数组包含两个特点:

  • 1.数组长度是固定的(初始定义)。
  • 2.数组里的元素类型相同,不能又是字符串,又是整数型。

概念总是太抽象,下面是说故事的环节。

某天你心血来潮,去到学校图书馆的一个书架旁边。

6bcee8875c64a0647b8e6651ef711211.png

你发现书按如下顺序排序。

红楼梦、水浒传、西游记、三国演义、男人装

你将这有序的排列,写成数组的形式:

array = [“红楼梦”,“水浒传”,“西游记”,“三国演义”,“男人装”]

此外,我们还需要索引的数字来标识每项数据的位置。

4fb7983c6fbc0829ab6ec8d006a55e77.png

你很兴奋,因为你完成了具象到抽象的过程,建模的过程。没错,你了解了数学建模。

如果你想深入了解一下数组的性能,那就不得不了解它的作用。

数组的作用

1.读取

查看数据结构中某个位置上的数据。对于数组来说,读取元素是最简单的操作,只要给出一个数组索引号,就可以读取到对应数组元素。比如查看书架索引3上对应的书是什么,就是array[3],一步到位。

2.查找

就是从数据结构中找出某个值所在。比如检查西游记这本书是否在书架中,给出其对应的索引。

78558bdbeb354eb3bc4b79d01dc8143c.png

如图所示,发现找到西游记的位置,需要三步。像这种逐个格子查找,我们叫做线性查找。

此外,我们需要思考一个问题。

在数组上线性查找最多需要几步?

那就需要考虑极端情况,如果查找的元素在数组的最后一个格子需要几步,比如这里我们查找男人装这本书,需要5步。

以此类推,查找一个N格的数组,线性查找需要最多步数是N。

3.插入

给数据结构添加一个数据值。比如给书架中添加一本书叫《易经》。插入分两种情况:

1.在数组的末尾插入,比如在末尾插入易经这本书,非常简单,一步到位。

3c1425f18a0d875993f9bf2c5e64832c.png

2.在数组的开头或者中间插入。

40cb49e48a7cc9b399853ea4bc7ac5f0.png

如图所示,为了达到目的,我们先把三国演义、男人装往右移,空出索引3,我们需要三步,前两步是移动元素,后一步是插入元素。

这时候我们还是要思考一个问题,数组的元素插入最多需要几步?

极端的例子,就是在长度为5的数组开头插入,需要5+1步

同理,一个含有N个元素的数组,其插入数组最坏需要N+1步(N步移动,最后一步插入)

4.删除:

从数据结构中移走一个数据值。比如要移走男人装这本书。和插入是相反的操作,在这里就不做演示了,本人就是懒。

编程语言实现

想学习java和python的小伙伴有福了,下面介绍如何用两种编程语言实现,数组的读取、查找、插入和删除。

1.java实现

1.读取和查找

public class ArrayDemo1 {
public static void main(String[] args) {
//静态创建一个字符串的数组
String[] str = new String[]{"红楼梦","水浒传","西游记","三国演义","男人装"};
// 读取索引为3的书
System.out.println(str[3]);
// 查找是否有西游记这本书,如果有请返回(循环查找)
for (int i = 0;i < str.length;i++){
if (str[i] == "西游记"){
System.out.println(i);
}
}
}
}

最后输出:

三国演义       2

2.插入和删除

public class MyArray {
private int size;
//插入代码
public void insert(String[] array, int index, String element) throws Eception {
size = array.length - 1;
//从右往左循环,将元素逐个向右挪一个
for (int i = size - 1; i >= index; i--) {
array[i + 1] = array[i];
}
//因为所有元素向右移了一步,所以空出一个位置,放入新元素
array[index] = element;
//增加了元素
size++;
}
public void delete(String[] array, int index) throws Exception {
//从左向右循环,将元素向左挪一位,完全相反的过程
for (int i = index; i < size - 1; i++) {
array[i] = array[i + 1];
}
//减少了一个元素
size--;
}
//打印结果
public void output(String[] array) {
for (int i = 0; i < array.length; i++) {
if (i != 0) {
System.out.print(", ");
}
System.out.print(array[i]);
}
System.out.println();
}
public static void main(String[] args) throws Exception {
MyArray my = new MyArray();
//动态创建数组,初始的数组长度为10。
String[] array2 = new String[10];
array2[0] = "红楼梦";
array2[1] = "水浒传";
array2[2] = "西游记";
array2[3] = "三国演义";
array2[4] = "男人装";
//在索引3处插入易经
my.insert(array2, 3, "易经");
//删除索引为5的元素,在这里是男人装
my.delete(array2, 5);
//输出
my.output(array2);
}
}

最后输出:

红楼梦, 水浒传, 西游记, 易经, 三国演义, null, null, null, null, null

后面为什么是null,是因为,你一开始设定的数组长度是10,而实际你只用了5个位置,所以其他位置都是空的。

在java里,虽然用null表示空,还是会分配内存地址的,因此你还有其余5个位置可以填充元素。

细心的小伙伴可能想到这个问题,如果插入的元素超过了数组的长度范围(超范围插入),又该怎么办呢?

因为数组的长度在创建时候就确定了,数组长度为10就是10,不会改变,毕竟不是匹诺曹的鼻子,想变长就变长的。

0225773ca248067896260f87704ae09c.png

所以,针对超范围的插入,只能重新创建一个更长的数组了,比如创建一个长度为20的数组。

当然,还有更好的办法,就是采用java提供的另一个数据类型,ArrayList(列表),可以将ArrayList想象成一种会自动扩容的Array(数组)

这个ArrayList(列表)解决了Array(数组)的两个问题。

  • 1.就是解决了Array创建后,长度不能改变的问题。ArrayList可以动态变化,自动扩容。
  • 2.解决Array只能存储同一类型的元素,比如存储字符串类型的元素,那就不能存放整数类型的元素。ArrayList可以存储不同类型的元素。

不光如此,ArrayList内置了很多函数,可以直接拿来使用,代码量大大的下降。

下面就是ArrayList的插入和删除java代码。

public class ArrayListDemo{
public static void main(String[] args) {
//动态创建ArrayList
ArrayList al = new ArrayList();
al.add("红楼梦");
al.add("水浒传");
al.add("西游记");
al.add("三国演义");
al.add("男人装");
//在索引3处插入易经
al.add(3, "易经");
//删除索引为5的元素,在这里是男人装
al.remove(5);
//输出
System.out.println(al);
// }
}
}

最后输出:

[红楼梦, 水浒传, 西游记, 易经, 三国演义]

有好奇心的小伙伴又想问了,既然ArrayList(列表)比Array(数组)这么有优势,那为什么还要发明数组呢。

世界上没有绝对的好,绝对的坏,一切都看情况而定,列表的这种方便性其实是牺牲了代码效率为代价的。

哈哈!要说到代码简单,不得不提到有主角光辉的python。

2.python实现

python作为动态语言,使用起来更加方便,要注意的是python原生是没有数组的概念,没有内置对数组的支持,所以python只有列表(List)。

来看看站在巨人肩膀上的感觉是什么样的吧。

list=["红楼梦","水浒传","西游记","三国演义","男人装"]
//读取索引为3对应的元素
name= list[3]
print(name)
//查找西游记是否在数组里,在的话,打印索引
if "西游记" in list:
print(list.index("西游记"))
//插入易经
list.insert(3,"易经")
//删除男人装
list.pop(5)
print(list)

最后输出:

三国演义      2        ['红楼梦', '水浒传', '西游记', '易经', '三国演义']

对,你没看错,短短几行,就完成了列表的读取、查找、插入、删除。

人生苦短,我用python。

6c6df40b57fabd50249b245c06b6f34b.png

还是那句,没有绝对的好,没有绝对的坏,一切都在变动中,视情况而定。如果注重代码的效率,还是选择java吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值