由于最近频繁在java、python、go三种开发语言中不断切换,有时候针对基础的数据结构和日常操作搞混了,因此本文进行相关梳理。文中涉及的相关数据结构和日常操作并不复杂,权当增强记忆和理解。
在这三种语言中,java已经实现的数据结构是最多,功能最丰富的,这归功于java社区的不断发展,相关的开发者能够不断的利用更方便、更使用的数据结构。相应的,在引用一个陌生的数据结构时,应当重视底层的实现,避免有意想不到的情况出现,导致程序的运行不符合预期。
# 定义空数据
int[] list = new int[5];
# 初始化定义数组
int[] list = new int[]{1,2,3,4,5,9};
由于数组Object[]在初始化的时候,已经确定了数组的长度,因此不能进行增加操作,只能在现有的数组基础上做数据调整。如果需要添加元素
如下方法可以在指定位置,在list数组中添加新元素,实现的效果等于List
# 指定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;
# 设置index的值
list[int index] = element;
list[1]=2;
# 获取index的值
list[int index];
list[1];
由于数组Object[]在初始化的时候,已经确定了数组的长度,因此不能进行增加操作,只能在现有的数组基础上做数据调整。如果需要添加元素
如下方法可以在指定位置,在list数组中添加新元素,实现的效果等于List
# 指定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;
没有原生的方法能够直接获取元素的位置,需要通过遍历查找的方法进行获取
# 获取object的索引位置,-1表示没有该元素
int index = binarySearch(Object[] list, Object key);
int index = binarySearch(list, Object key)
# 获取list的总长度
int length = list.length
Arrays.sort(list);
Arrays.sort(list, Collections.reverseOrder());
声明不固定长度的列表,因此能够提供更加丰富的api和操作方法,也是最常用的数据结构。
# 定义空列表
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);
}};
# 指定index后添加元素
void add(int index, E element);
list.add(1,2);
# 默认在最后添加元素
void add(E element);
list.add(1);
# 设置index的值
list.set(int index, E element);
list.set(1, 2);
# 获取index的值
list.get(int index);
list.get(1);
# 指定index后删除元素
list.remove(int index);
list.remove(1);
# 获取object的索引位置,-1表示没有该元素
int index = list.indexOf(Object o);
int index = list.indexOf(1);
# 获取list的总长度
int length = list.size();
int length = list.size();
Collections.sort(list);
Collections.sort(list,Collections.reverseOrder());
String[] strArray = new String[10];
List<String> arrayList = new ArrayList<>(strArray.length);
Collections.addAll(arrayList, strArray);
List<String> arrayList = new ArrayList<Integer>() {{
add(String o1);
add(String o2);
}};
String[] strArray = arrayList.toArray(new String[arrayList.size()]);
# 定义元素类
class User {
String name;
int age;
}
# 定义相关列表
List<User> list = new ArrayList<>();
list.add(new User{"张三", 3});
list.add(new User{"李四", 4});
list.add(new User{"王五", 5});
# 或者使用如下方式进行
List<User> list = new ArrayList<User>(){{
add(new User{"张三", 3});
add(new User{"李四", 4});
add(new User{"王五", 5});
}};;
# 进行排序
Collections.sort(list3, new Comparator<User>() {
@Override
public int compare(User u1, User u2) {
int diff = u1.getAge() - u2.getAge();
if (diff > 0) {
return 1;
} else if (diff < 0) {
return -1;
}
return 0; //相等为0
}
}); // 按年龄排序
go语言没有java语言的数据结构丰富,只有简单的几种基础类型,如果希望引入复杂的数据结构实现类似java一样复杂多样的功能,需要引入第三方库。不过,在引入第三方库时,一定要确保对引用的库底层的实现是足够了解的,避免有意想不到的情况出现,导致程序的运行不符合预期。
go语言中在列表是实现上通常是分为数组和切片2种方式。两者在声明上很贴近,差别就是数组声明是指定长度,而切片声明是不指定长度。
go语言定义的数组特性和java是一样的,可以参考 Java静态数组
声明时必须指定长度,注意跟切片的区别。 查看Go切片
# 定义空数据
var list [5]int;
# 初始化定义数组
var list = [5]int{1, 2, 3, 4, 5}
由于数组[]Object在初始化的时候,已经确定了数组的长度,因此不能进行增加操作,只能在现有的数组基础上做数据调整。如果需要添加元素
如下方法可以在指定位置,在list数组中添加新元素
# 指定index后添加元素
int index = 2;
int value = 5;
var array = [5]int{1, 2, 3, 4, 5}
var newArray = [len(array)]int{}
for (int i = 0; i < len(array); 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;
# 设置index的值
list[int index] = element;
list[1]=2;
# 获取index的值
list[int index];
list[1];
由于数组[]Object在初始化的时候,已经确定了数组的长度,因此不能进行增加操作,只能在现有的数组基础上做数据调整。如果需要添加元素
如下方法可以在指定位置,在list数组中添加新元素
# 指定index后删除元素
int index = 2;
int value = 5;
var array = [5]int{1, 2, 3, 4, 5}
var newArray = [len(array)]int{}
for (int i = 0; i < len(array); i++) {
# 移除index位置的元素
if(i != 2) {
newArray[i] = array[i];
}
}
array = newArray;
没有提供原生的方法,需要自己实现。
var test = [5]int{1,2,3,4,5};
for index, v := range test {
if v == 1 {
return index
}
}
# 获取list的总长度
var length = len(list)
没有提供原生的方法,需要自己实现。
// 冒泡正向排序
var test = [5]int{1, 2, 3, 4, 5}
for i := 0; i < len(test)-1; i++ {
for j := i + 1; j < len(test); j++ {
if test[i] > test[j] {
var tmp = test[j]
test[j] = test[i]
test[i] = tmp
}
}
}
没有提供原生的方法,需要自己实现。
// 冒泡逆向排序
var test = [5]int{1, 2, 3, 4, 5}
for i := 0; i < len(test)-1; i++ {
for j := i + 1; j < len(test); j++ {
if test[i] < test[j] {
var tmp = test[j]
test[j] = test[i]
test[i] = tmp
}
}
}
声明不固定长度的列表,因此能够提供更加丰富的api和操作方法,也是最常用的数据结构。声明不指定长度,注意跟数组的区别。 查看Go静态数组
# 定义空数据
var list []int;
# 初始化定义数组
var list = []int{1, 2, 3, 4, 5}
# 指定index后添加元素
index := 2 //需要插入的位置
copy(list[index+1:], list[index:])
list[index] = 100
# 默认在最后添加元素
list = append(list, E element)
list = append(list, 1)
# 默认在最后增加一个新的切片
list = append(list, list2)
# 设置index的值
list.set(int index, E element);
list[index] = 100
# 获取index的值
list[index]
没有原生的方法,需要自己实现,巧妙利用append方法
# 指定index后删除元素
list = append(list[:index], list[index+1:]...)
没有提供原生的方法,需要自己实现。
var test = []int{1,2,3,4,5};
for index, v := range test {
if v == 1 {
return index
}
}
# 获取list的总长度
int length = len(list)
sort.Ints(list)
sort.Sort(sort.Reverse(sort.IntSlice(list)))
# 指定index范围
list[index: index2]
list[index]
# 数组拷贝给切片
Copy(dst,src) 将src的值全部复制到dst中。
# 数组拷贝给切片
array:= [3]int{1,2,3}
//如果加入的两个数组切片不一样大,就会按其中较小的那个数组切片的元素个数进行复制所以要先声明slice切片的长度,否则会无法赋值。
s := make([]int, len(array))
copy(s,array[:])
# 切片给数组赋值
copy(array[:],s)
type aStructure struct {
name string
age int
}
# 指定年龄正向排序
list := []aStructure{}
sort.Slice(list, func(i, j int) bool {
return list[i].age < mySlice[j].age
})
# 指定年龄逆向排序
list := []aStructure{}
sort.Slice(list, func(i, j int) bool {
return list[i].age > mySlice[j].age
})