数据结构Java --- 线性表与ArrayList

一. 线性表

线性表有顺序表,链表,栈和队列
存储结构分为线性存储(线性表)和链式存储(链式表)

二. 线性表

线性表通常用数组来实现

public class Emptyfull extends RuntimeException{
    public Emptyfull(){

    }
    public Emptyfull(String message){
        super(message);
    }
}
public class FindFulException extends RuntimeException{
    public FindFulException(){

    }
    public FindFulException(String message){
        super(message);
    }
}
public class ListWrongful extends RuntimeException{
    public ListWrongful(){

    }

    public ListWrongful(String message) {
        super(message);
    }
}
import java.util.Arrays;

public class MyArrayList {
    private int[] list;
    private int usesize;
    public MyArrayList(){
        list = new int[10];
    }
    public boolean isFull(){
        return usesize >= list.length;
    }
    public boolean isEmpty(){
        return this.usesize == 0;
    }
    //默认最后加
    public void add(int data){
        if (isFull()){
            System.out.println("已满,准备扩容中...");
            this.list = Arrays.copyOf(this.list, 2 * this.list.length);
            System.out.println("扩容成功");
        }
        this.list[this.usesize] = data;
        this.usesize++;
    }
    public void add(int pos, int data) throws ListWrongful{
        if (isFull()){
            System.out.println("已满,准备扩容中...");
            list = Arrays.copyOf(list, 2 * usesize);
            System.out.println("扩容成功");
        }
        if (pos < 0 || pos > usesize) {
            throw new ListWrongful("pos不合法异常");
        }
        for (int i = usesize - 1; i >= pos; i--){
            list[i + 1] = list[i];
        }
        list[pos] = data;
        usesize++;
    }
    public boolean contains(int toFind){
        for (int i = 0; i < this.usesize; i++){
            if(toFind == this.list[i]){
                return true;
            }
        }
    return false;
    }
    public int indexOf(int toFind){
        for(int i =0; i < this.usesize; i++){
            if (toFind == list[i]){
                return i;
            }
        }
    return -1;
    }
    public int get(int pos)throws Emptyfull{
        if (isEmpty()){
            throw new Emptyfull("获取元素时线性表为空异常");
        }
        if (pos < 0 || pos >= usesize){
            throw new ListWrongful("获取元素时,pos不合法异常");
        }
    return list[pos];
    }
    public void set (int pos, int value)throws Emptyfull, ListWrongful{
        if(isEmpty()){
            throw new Emptyfull("修改元素时,pos不合法异常");
        }
        if (pos < 0 || pos >= usesize){
            throw new ListWrongful("修改元素时,pos不合法异常");
        }
        list[pos] = value;
    }
    public void remove(int toRemove)throws Emptyfull, FindFulException{
        if (isEmpty()) {
            throw new Emptyfull("删除元素时,线性表为空");
        }
        if(indexOf(toRemove) < 0){
            throw new FindFulException("删除元素时,未找到该元素");
        }
        for(int i = indexOf(toRemove); i < this.usesize - 1; i++){
            this.list[i] = list[i + 1];
        }
        this.list[usesize - 1] = 0;
        this.usesize--;
    }
    public int size(){
        return usesize;
    }
    public void clear(){
        this.usesize = 0;
    }
    public void display(){
        for(int i = 0; i < usesize; i++){
            System.out.print(list[i] + " ");
        }
        System.out.println();
    }
}
public class ArrayList {
    public static void main(String[] args) {
        MyArrayList myarraylist = new MyArrayList();
        myarraylist.add(1);
        myarraylist.add(2);
        myarraylist.add(3);
        try{
            myarraylist.add(10, 10);
        }
        catch(ListWrongful e){
            e.printStackTrace();
        }
        myarraylist.display();
    }
}

Arraylist简介

Arraylist是以泛型方式实现的,使用时需要实例化
在这里插入图片描述

import java.util.ArrayList;
public class Test {
    public static void main(String[] args) {
        ArrayList<Integer> array = new ArrayList<Integer>();
        array.add(1);
        //array.add("wang");
    }
}

ArrayList底层是一段连续的空间,可以动态扩容,是一个动态的线性表

Arraylist 使用

Arraylist有三种构造方法

Arraylist 的常见操作

在这里插入图片描述需要注意的有:
remove方法:

//删除下标位1的元素;
        list.remove(1);
//删除元素值为1的元素
        list.remove(new Integer(1));
import java.util.ArrayList;

public class Test {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        //删除下标位1的元素;
        list.remove(1);
        System.out.println(list);
        //删除元素值为1的元素
        list.remove(new Integer(1));
        System.out.println(list);
    }
}

在这里插入图片描述sublist方法:

   List<Integer> list1 = list.subList(1,2);
        System.out.println(list1);
        list.set(1, 9);
        System.out.println(list+" "+list1);

在这里插入图片描述list1 截取list时是将list中对应下标元素的地址赋值给了list

迭代器Arraylist的遍历

Iterator迭代器:

        Iterator<Integer> list2 = list.iterator();
        while(list2.hasNext()){
            System.out.print(list2.next() + " ");
        }

在这里插入图片描述ListIterator 迭代器:

ListIterator<Integer> list3= list.listIterator();
while(list3.hasNext()){
System.out.print(list3.next());
}

void remove():删除迭代器刚越过的元素

Arraylist的具体使用

小练习

1 集合的排序(Collections.sort)

Arraylist可以存放指定自定义类型
Collections.sort可以对Arraylist进行排序,自定义类需要实现Comparable.

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;

class Student implements Comparable<Student>{
    String name;
    int age;
    double score;
    public Student(String name, int age, double score){
        this.age = age;
        this.name = name;
        this.score = score;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", score=" + score +
                '}';
    }

    @Override
    public int compareTo(Student o) {
        return this.name.compareTo(o.name);
    }
}
public class Test1 {
    public static void main(String[] args) {
        ArrayList<Student> array = new ArrayList<Student>();
        array.add(new Student("e张三", 19, 78.45));
        array.add(new Student("a李四", 30, 89.34));
        array.add(new Student("r王五", 20, 90.23));
        //System.out.println(array);
        Collections.sort(array);
        Iterator<Student> array1 = array.iterator();
        while(array1.hasNext()){
            System.out.println(array1.next());
        }
    }
}

2. 删除第一个字符串中在第二个字符串中出现的字符

import java.util.ArrayList;

public class Test {
    public static void main(String[] args) {
        String s1 = "welcome to \"Shangxi\"";
        String s2 = "come";
        ArrayList<Character> array = new ArrayList<>();
        for(int i = 0; i < s1.length(); i++){
            char s = s1.charAt(i);
            if (!s2.contains(s + "")){
                System.out.print(s);
                array.add(s);
            }
        }

    }
}

3. 实现一个简单洗牌算法

一个牌类:

package dome;

public class Poker {
    private String decor;
    private int number;

    public String getDecor() {
        return decor;
    }

    public void setDecor(String decor) {
        this.decor = decor;
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }
    public Poker(String decor, int number){
        this.decor = decor;
        this.number = number;
    }
    public String toString(){
        return decor + " " + number;
    }
}

一副牌类:

package dome;
import java.util.ArrayList;
import java.util.Random;
public class Pokers {
    private String[] decors = {"♥", "♠", "♣", "♦"};
    ArrayList<Poker> pokers = new ArrayList<>();
    public ArrayList<Poker> buyPoker () {
        for(int i = 0; i < 4; i++){
            for(int j = 1; j <= 13; j++){
                pokers.add(new Poker(decors[i], j));
            }
        }
        return pokers;
    }
    public void swap(ArrayList<Poker> pokers, int i, int j){
        Poker poker = pokers.get(i);
        pokers.set(i, pokers.get(j));
        pokers.set(j, poker);
    }
    public ArrayList<Poker> shuffle(ArrayList<Poker> decors) {
        Random random = new Random();
        for(int i = decors.size() - 1; i >0; i--){
            int j = random.nextInt(i);
            swap(pokers, i, j);
        }
        return decors;
    }
    public String toString(){
        return "pokers" + pokers ;
    }
}

测试类:

package dome;

import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        Pokers pokers = new Pokers();
        System.out.println("买牌");
        pokers.buyPoker();
        System.out.println(pokers);
        System.out.println("洗牌");
        pokers.shuffle(pokers.pokers);
        System.out.println(pokers);
        System.out.println("发牌中...");
        //创建三个人
        ArrayList<ArrayList<Poker>> person = new ArrayList<>();
        ArrayList<Poker> person1 = new ArrayList<Poker>();
        ArrayList<Poker> person2 = new ArrayList<Poker>();
        ArrayList<Poker> person3 = new ArrayList<Poker>();
        person.add(person1);
        person.add(person2);
        person.add(person3);
        //发牌给三个人,每人五张牌
        for(int i = 0; i < 5; i++){
            for(int j = 0; j < 3; j++){
            person.get(j).add(pokers.pokers.remove(0));
            }
        }
        System.out.println("揭牌:");
        System.out.println("第一个人" + person1);
        System.out.println("第二个人" + person2);
        System.out.println("第三个人" + person3);
        System.out.println("牌堆剩余牌:" + pokers);
    }
}

在这里插入图片描述

4. 杨辉三角

import java.util.ArrayList;

public class Test {
    public static ArrayList<ArrayList<Integer>> creat (int c1){
        ArrayList<ArrayList<Integer>> yanghui = new ArrayList<>();
        ArrayList<Integer> first1 = new ArrayList();
        first1.add(1);
        yanghui.add(first1);
        System.out.println(first1);
        for (int j = 1; j < c1; j++){
            ArrayList<Integer> second = new ArrayList<>();
            second.add(1);
            for(int i = 1; i < j; i++){
                second.add(i, yanghui.get(j - 1).get(i) + yanghui.get(j - 1).get(i - 1));
            }
            second.add(1);
            yanghui.add(second);
            System.out.println(second);
        }

        return yanghui;
    }
    public static void main(String args[]){
        creat(5);
    }
}

写这个算法时存在的问题是:在第一个for循环内没有新建一个顺序表,而是在原有顺序表上进行操作,这样是不行的,因为由于使用的是同一个顺序表,所以在操作顺序表中的第i个顺序表时第i-1个顺序表也会发生变化.

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

With Order @!147

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值