【Java数据结构】初识线性表之一:次序表
利用Java简质朴现一个次序表次序表是用一段物理地点连续的存储单元依次存储数据元素的线性结构,一样寻常环境下采取数组存储。在数组上完成数据的增删查改。
线性表大抵包罗如下的一些方法:
public class MyArrayList {
private int[] array;
private int size;
// 默认构造方法默认分配空间
SeqList(){ }
// 将次序表的底层容量设置指定容量
SeqList(int initcapacity){ }
// 新增元素,默认在数组末了新增
public void add(int data) { }
// 在 pos 位置新增元素
public void add(int pos, int data) { }
// 判定是否包罗某个元素
public boolean contains(int toFind) { return true; }
// 查找某个元素对应的位置
public int indexOf(int toFind) { return -1; }
// 获取 pos 位置的元素
public int get(int pos) { return -1; }
// 给 pos 位置的元素设为 value
public void set(int pos, int value) { }
//删除第一次出现的关键字key
public void remove(int toRemove) { }
// 获取次序表长度
public int size() { return 0; }
// 清空次序表
public void clear() { }
// 打印次序表
public void display() { }
}
接下来根据上面的方法实现一个 int 范例的次序表:
import java.util.Arrays;
public class MyArrayList {
private int[] elem;
private int usedSize;
private static final int DEFAULT_SIZE = 10;
public MyArrayList(){
elem = new int;
}
public MyArrayList(int initCapacity){
elem = new int;
}
private boolean checkCapacity(){
if(this.usedSize == elem.length){
return true;
}
return false;
}
public void display(){
for (int i = 0; i < this.usedSize; i++) {
System.out.print(this.elem + " ");
}
}
public void add(int data){
if(checkCapacity()){
this.elem = Arrays.copyOf(this.elem,2*elem.length);
}
this.elem = data;
this.usedSize++;
return;
}
public void add(int pos,int data){
if(pos > this.usedSize || pos < 0){
throw new PosOutOfBoundsException("插入位置错误!");
}
if(checkCapacity()){
this.elem = Arrays.copyOf(this.elem,2*elem.length);
}
for (int i = this.usedSize - 1; i >=pos ; i--) {
elem = elem;
}
this.elem = data;
this.usedSize++;
return;
}
public boolean contains(int data){
for (int i = 0; i < this.usedSize; i++) {
if(this.elem == data){
return true;
}
}
return false;
}
public int indexof(int data){
for (int i = 0; i < this.usedSize; i++) {
if(this.elem == data){
return i;
}
}
return -1;
}
public int get(int pos){
if(pos >= this.usedSize || pos < 0){
throw new PosOutOfBoundsException("输入的位置错误!");
}
return this.elem;
}
public void set(int pos,int data){
if(pos >= this.usedSize || pos < 0){
throw new PosOutOfBoundsException("输入的位置错误!");
}
this.elem = data;
}
public int size(){
return this.usedSize;
}
public void remove(int data){
if(this.contains(data)){
int pos = this.indexof(data);
for (int i = pos; i < this.usedSize - 1; i++) {
this.elem = this.elem;
}
this.usedSize--;
}else{
throw new PosOutOfBoundsException("没有该元素");
}
}
public void clear(){
this.usedSize = 0;
return;
}
} ArrayList简介
在聚集框架中,ArrayList是一个平凡的类,实现了List接口,具体框架图如下:
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvZTY3YmZlZjY5YzY3NDhiYWFhM2Y5YTBhZDAwYmFhZWMucG5n
[*]ArrayList是以泛型方式实现的,利用时必须要先实例化
[*]ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问
[*]ArrayList实现了Cloneable接口,表明ArrayList是可以clone的
[*]ArrayList实现了Serializable接口,表明ArrayList是支持序列化的
[*]和Vector差别,ArrayList不是线程安全的,在单线程下可以利用,在多线程中可以选择Vector大概
[*]CopyOnWriteArrayList
[*]ArrayList底层是一段连续的空间,而且可以动态扩容,是一个动态范例的次序表
ArrayList怎样利用
ArrayList的构造方法
ArrayList中的构造方法:
ArrayList();//无参构造
ArrayList(Collection<? extends E> c);//利用其他 Collection 构建 ArrayList
ArrayList(int initialCapacity);//指定次序表初始容量
代码示例:
public class Test {
public static void main(String[] args) {
List<Integer> list1 = new ArrayList<>();//无参构造
List<Integer> list2 = new ArrayList<>(10);//指定容量
list2.add(1);
list2.add(2);
list2.add(3);
List<Integer> list3 = new ArrayList<>(list2);//利用其他 Collection 构建 ArrayList
}
} ArrayList常见操纵
尾插
public class Test {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();//无参构造
list.add(1);
list.add(2);
list.add(3);
System.out.println(list);
}
} 将元素插入到指定位置
public class Test {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(1,4);
System.out.println(list);
}
} 尾插另一个次序表中的元素
public class Test {
public static void main(String[] args) {
List<Integer>list1 = new ArrayList<>();
list1.add(4);
list1.add(5);
list1.add(6);
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.addAll(list1);
System.out.println(list);
}
} 删除指定位置元素
public class Test {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.remove(1);
System.out.println(list);
}
} 删除指定命据
public class Test {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.remove(new Integer(2));
System.out.println(list);
}
} 获取指定位置元素
public class Test {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
System.out.println(list.get(1));
}
} 将指定位置元素设置为新数据
public class Test {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.set(1,4);
System.out.println(list);
}
} 清空次序表
public class Test {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.clear();
System.out.println(list);
}
} 判定一个元素是否在次序表中
public class Test {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
System.out.println(list.contains(2));
System.out.println(list.contains(4));
}
} 返回第一个指定元素地点下标
public class Test {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(1);
System.out.println(list.indexOf(1));
}
} 返回末了一个指定元素地点下标
public class Test {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(1);
System.out.println(list.lastIndexOf(1));
}
} 截取部门list
public class Test {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
System.out.println(list.subList(0,2));
}
} 遍历 ArrayList 的三种方法
ArrayList 可以利用三方方式遍历:for循环+下标、foreach增强循环、利用迭代器
public class Test {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
//使用fori遍历
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i));
}
System.out.println();
//使用foreach遍历
for(Integer integer:list){
System.out.print(integer);
}
System.out.println();
//使用迭代器遍历
Iterator<Integer> it = list.listIterator();
while(it.hasNext()){
System.out.print(it.next());
}
}
} 运行效果:
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvNDlmOWFhZmFkNDJkNDFiYTk0NTJiOWY2ZmMwZmI2MGQucG5n ArrayList的场景利用
洗牌算法
将一副扑克牌随机打乱,并分配给三个人,每人五张牌
算法原码地点位置:
shufflecards · 不绝淡水鱼/Java经典例题 - 码云 - 开源中国 (gitee.com)
杨辉三角
标题形貌:
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvMjUwMTg2MTVlMGVkNDg3MWI3OThkZTgxOGJjZTIxYWMucG5n
代码实现:
public class Test {
public static List<List<Integer>> generate(int numRows) {
List<List<Integer>> list = new LinkedList<>();
for (int i = 0; i < numRows; i++) {
List<Integer> row = new LinkedList<>();
for (int j = 0; j < i + 1; j++) {
if (j == 0 || i == j) {
row.add(1);
} else {
row.add(list.get(i - 1).get(j - 1) + list.get(i - 1).get(j));
}
}
list.add(row);
}
return list;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int numRows = scanner.nextInt();
List<List<Integer>> list = generate(numRows);
for (int i = 0; i < numRows; i++) {
for (int j = 0; j < i + 1; j++) {
System.out.print(list.get(i).get(j) + " ");
}
System.out.println();
}
}
} 运行效果图:
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvNGEyNGFhOGEzMDI3NGU2MGE3ZjkzNWNmZDhhZGI5NDAucG5n
页:
[1]