Java/Python/Go不同开发语言基础数据结构和相关操作总结-数组篇

Java/Python/Go不同开发语言基础数据结构和相关操作总结

由于最近频繁在java、python、go三种开发语言中不断切换,有时候针对基础的数据结构和日常操作搞混了,因此本文进行相关梳理。文中涉及的相关数据结构和日常操作并不复杂,权当增强记忆和理解。


1. Java

在这三种语言中,java已经实现的数据结构是最多,功能最丰富的,这归功于java社区的不断发展,相关的开发者能够不断的利用更方便、更使用的数据结构。相应的,在引用一个陌生的数据结构时,应当重视底层的实现,避免有意想不到的情况出现,导致程序的运行不符合预期。

1.1 静态数组Object[]

  • 静态数组的长度一旦定义就不能更改,无法动态扩容数组的长度。如果需要更改数组长度,通常的做法是创建一个新的数组,并将相关的数据拷贝到新数据上
  • 由于定义了数组长度,因此每个元素可以通过下标获取,读取的成本比较小,时间长度是O(1)
  • 如果需要再指定位置增、删元素,需要移动后续的相关元素,因此写的成本较大,时间长度是O(n)
  • 返回Go静态数组
  • 返回Python静态数组

1.1.1 数据结构和定义方式

# 定义空数据
int[] list = new int[5];

# 初始化定义数组
int[] list = new int[]{
   
   1,2,3,4,5,9};

1.1.2 增加

由于数组Object[]在初始化的时候,已经确定了数组的长度,因此不能进行增加操作,只能在现有的数组基础上做数据调整。如果需要添加元素

  • 需要复制一个新数据,并且size+1
  • 复制原有数组,根据情况拷贝相关的值到新数据中
  • 根据需要添加的位置,并将后续的元素进行移动

如下方法可以在指定位置,在list数组中添加新元素,实现的效果等于List<Object>的void add(int index, E element);

# 指定index后添加元素
int index = 2;
int value = 5;
int[] array = new int[]{
   
   1,2,3,4};
int[] newArray = new int[array.length + 1];
for (int i = 0; i < array.length; i++) {
   
   
	newArray[i] = array[i];
}
# 从后往前移动位置,并在index位置留空,便于后续调整index位置的值
for (int i = newArray.length - 1; i > index; i--) {
   
   
	newArray[i] = newArray[i - 1];
}
newArray[index] = value;
array = newArray;

1.1.3 修改

# 设置index的值
list[int index] = element;
list[1]=2;

1.1.4 查询

# 获取index的值
list[int index];
list[1];

1.1.5 删除

由于数组Object[]在初始化的时候,已经确定了数组的长度,因此不能进行增加操作,只能在现有的数组基础上做数据调整。如果需要添加元素

  • 需要复制一个新数据,并且size-1
  • 复制原有数组,根据情况拷贝相关的值到新数据中
  • 根据需要删除的位置,并将后续的元素进行移动

如下方法可以在指定位置,在list数组中添加新元素,实现的效果等于List<Object>的void remove(int index);

# 指定index后删除元素
int index = 2;
int value = 5;
int[] array = new int[]{
   
   1,2,3,4};
int[] newArray = new int[array.length + 1];
for (int i = 0; i < array.length; i++) {
   
   
	# 移除index位置的元素
	if(i != 2) {
   
   
		newArray[i] = array[i];
	}	
}
array = newArray;

1.1.6 获取元素的位置

没有原生的方法能够直接获取元素的位置,需要通过遍历查找的方法进行获取

# 获取object的索引位置,-1表示没有该元素
int index = Arrays.binarySearch(Object[] list, Object key);
int index = Arrays.binarySearch(list, Object key)

1.1.7 获取总长度

# 获取list的总长度
int length = list.length

1.1.8 正向排序

Arrays.sort(list);

1.1.9 逆向排序

Arrays.sort(list, Collections.reverseOrder());

1.2 动态列表List<Object>

声明不固定长度的列表,因此能够提供更加丰富的api和操作方法,也是最常用的数据结构。

1.2.1 数据结构和定义方式

# 定义空列表
List<Integer> list = new ArrayList<>();

# 初始化定义数组
ArrayList<Integer> obj = new ArrayList<Integer>() {
   
   {
   
   
    add(Object o1);
    add(Object o2);
}};

# 初始化定义数组,T对象
ArrayList<T> obj = new ArrayList<T>() {
   
   {
   
   
    add(Object o1);
    add(Object o2);
}};

1.2.2 增加

# 指定index后添加元素
void add(int index, E element);
list.add(1,2);

# 默认在最后添加元素
void add(E element);
list.add(1);

1.2.3 修改

# 设置index的值
list.set(int index, E element);
list.set(1, 2);

1.2.4 查询

# 获取index的值
list.get(int index);
list.get(1);

1.2.5 删除

# 指定index后删除元素
list.remove(int index);
list.remove(1);

1.2.6 获取元素的位置

# 获取object的索引位置,-1表示没有该元素
int index = list.indexOf(Object o);
int index = list.indexOf(1);

1.2.7 获取总长度

# 获取list的总长度
int length = list.size();
int length = list.size();

1.2.8 正向排序


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值