ArrayList 类 (顺序表)

news2024/12/24 13:30:52

目录

一. ArrayList 基本介绍

二. ArrayList 中的法及其应用

1. 添加元素

(1) add()

(2) addAll()

2. 删除元素

(1) remove()

(2) removeAll()

3. 遍历元素

(1) for 循环遍历

(2) for - each 遍历

(3) 迭代器遍历

(4) 列表迭代器遍历

4. 判断

(1) cotains()

(2) containsAll()

(3) isEmpty()

5. 获取子列表

三. 模拟实现 ArrayList

1. 模拟实现添加元素

2. 模拟实现删除元素

3. 模拟实现判断

4. 验证是否正确


一. ArrayList 基本介绍

(1) ArrayList (顺序表) 继承于 List接口, 是Java集合框架的一部分.

(2) ArrayList 用于存放可重复, 有序的元素.

(3) ArrayList 的存储结构是数组. (底层使用数组来实现).

(4) ArrayList提供了比标准数组更多的功能. 例如: 动态调整大小, 添加元素, 删除元素等.

(5) ArrayList 的特点是 查找 的速度快 (因为可以直接通过下标查找), 添加/删除 元素的速度慢.

二. ArrayList 中的法及其应用

通过查看文档我们可以看到, List 接口主要有以上几种方法. 我把其中比较重要的几个方法勾选了出来, 这些我们要重点熟悉掌握. 大家也可以自行翻阅文档进行学习. 

首先我们要在list里存放对象. 假设我们要存放Student类型的对象.

首先定义学生类:

public class Student {
    private String name;
    private int age;
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
 
    public String getName() {
        return name;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
 
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {  //1. 如果this和obj指向同一个对象, 则返回true;
            return true;
        }
        if (obj instanceof Student) {  //2. 如果this和obj指向不同对象, 而且obj是Student类型的
            if (this.age == ((Student) obj).getAge() && this.name == ((Student) obj).getName()) {
                return true;
            }
            return false;
        }
        return false;
    }
}

1. 添加元素

(1) add()

add() 方法, 有两个版本: 版本一有一个参数, 版本二有两个参数. 

[1] add(E e)  将指定元素添加到末尾

import java.util.ArrayList;

public class demo {
    public static void main(String[] args) {
        Student s1 = new Student("刘德华",22);
        Student s2 = new Student("梁朝伟",24);
        Student s3 = new Student("吴彦祖",26);

        ArrayList<Student> arrayList = new ArrayList<>();
        arrayList.add(s1);
        arrayList.add(s2);
        arrayList.add(s3);
        System.out.println(arrayList);
    }
}

 

[2] add(int index, E element)  将指定元素插入指定位置.

import java.util.ArrayList;

public class demo {
    public static void main(String[] args) {
        Student s1 = new Student("刘德华",22);
        Student s2 = new Student("梁朝伟",24);
        Student s3 = new Student("吴彦祖",26);

        ArrayList<Student> arrayList = new ArrayList<>();
        arrayList.add(s1);
        arrayList.add(s2);
        arrayList.add(s3);
        System.out.println(arrayList);

        Student s4 = new Student("Jack",45);
        arrayList.add(1,s4);
        System.out.println(arrayList);
    }
}

(2) addAll()

addAll() 方法的基本作用是将一个列表添加到另一个列表中去. 与add() 类似, addAll() 方法也有两个版本:

[1] addAll(Collection e) 表示将另一列表添加到当前列表之后.

import java.util.ArrayList;

public class demo {
    public static void main(String[] args) {
        Student s1 = new Student("刘德华",22);
        Student s2 = new Student("梁朝伟",24);
        Student s3 = new Student("吴彦祖",26);

        ArrayList<Student> arrayList = new ArrayList<>();
        arrayList.add(s1);
        arrayList.add(s2);
        arrayList.add(s3);
        
        System.out.println(arrayList); // 打印arrayList

        Student s4 = new Student("Jack",45);
        Student s5 = new Student("Bob", 55);
        Student s6 = new Student("Molly",31);
        
        ArrayList<Student> arrayList1 = new ArrayList<>();
        arrayList1.add(s4);
        arrayList1.add(s5);
        arrayList1.add(s6);
        
        System.out.println(arrayList1); // 打印arrayList1
        
        arrayList.addAll(arrayList1);
        System.out.println(arrayList); // 打印合并之后的arrayList
    }
}

 [2] addAll(intindex, Collection e) 表示在指定位置插入另一列表.

import java.util.ArrayList;

public class demo {
    public static void main(String[] args) {
        Student s1 = new Student("刘德华",22);
        Student s2 = new Student("梁朝伟",24);
        Student s3 = new Student("吴彦祖",26);

        ArrayList<Student> arrayList = new ArrayList<>();
        arrayList.add(s1);
        arrayList.add(s2);
        arrayList.add(s3);

        System.out.println(arrayList);

        Student s4 = new Student("Jack",45);
        Student s5 = new Student("Bob", 55);
        Student s6 = new Student("Molly",31);

        ArrayList<Student> arrayList1 = new ArrayList<>();
        arrayList1.add(s4);
        arrayList1.add(s5);
        arrayList1.add(s6);

        System.out.println(arrayList1);

        arrayList.addAll(1,arrayList1);
        System.out.println(arrayList);
    }
}

2. 删除元素

(1) remove()

remove() 方法, 参数可以传递下标, 也可以传递对象的引用. 作用都是把指定节点删除掉. 代码演示如下:

import java.util.ArrayList;

public class demo {
    public static void main(String[] args) {
        Student s1 = new Student("刘德华",22);
        Student s2 = new Student("梁朝伟",24);
        Student s3 = new Student("吴彦祖",26);

        ArrayList<Student> arrayList = new ArrayList<>();
        arrayList.add(s1);
        arrayList.add(s2);
        arrayList.add(s3);
        System.out.println(arrayList);

        arrayList.remove(0); // 传递下标删除元素
        System.out.println(arrayList);
        arrayList.remove(s2); // 传递对象删除元素
        System.out.println(arrayList);
    }
}

(2) removeAll()

与add()和addAll()的关系类似, remove()方法是删除单个元素, removeAll()方法是从一个列表里删除另一个列表中的所有元素.

因为我们在Student里重写了equals()方法, 所以只要两个对象的name和age属性一样, 那么就认为这两个对象是相同的.

import java.util.ArrayList;

public class demo {
    public static void main(String[] args) {
        Student s1 = new Student("刘德华",22);
        Student s2 = new Student("梁朝伟",24);
        Student s3 = new Student("吴彦祖",26);

        ArrayList<Student> arrayList = new ArrayList<>();
        arrayList.add(s1);
        arrayList.add(s2);
        arrayList.add(s3);

        System.out.println(arrayList);

        Student s4 = new Student("Jack",45);
        Student s5 = new Student("Bob", 55);
        Student s6 = new Student("Molly",31);

        ArrayList<Student> arrayList1 = new ArrayList<>();
        arrayList1.add(s1);
        arrayList1.add(s2);

        System.out.println(arrayList1);

        arrayList.removeAll(arrayList1);
        System.out.println(arrayList);
    }
}

3. 遍历元素

(1) for 循环遍历
import java.util.ArrayList;

public class demo {
    public static void main(String[] args) {
        Student s1 = new Student("刘德华",22);
        Student s2 = new Student("梁朝伟",24);
        Student s3 = new Student("吴彦祖",26);

        ArrayList<Student> arrayList = new ArrayList<>();
        arrayList.add(s1);
        arrayList.add(s2);
        arrayList.add(s3);
        
        for (int i = 0; i < arrayList.size(); i++) {
            System.out.println(arrayList.get(i));
        }
    }
}

(2) for - each 遍历
import java.util.ArrayList;

public class demo {
    public static void main(String[] args) {
        Student s1 = new Student("刘德华",22);
        Student s2 = new Student("梁朝伟",24);
        Student s3 = new Student("吴彦祖",26);

        ArrayList<Student> arrayList = new ArrayList<>();
        arrayList.add(s1);
        arrayList.add(s2);
        arrayList.add(s3);

       for (Student stu: arrayList) {
           System.out.println(stu);
       }
    }
}

(3) 迭代器遍历
import java.util.ArrayList;
import java.util.Iterator;

public class demo {
    public static void main(String[] args) {
        Student s1 = new Student("刘德华",22);
        Student s2 = new Student("梁朝伟",24);
        Student s3 = new Student("吴彦祖",26);

        ArrayList<Student> arrayList = new ArrayList<>();
        arrayList.add(s1);
        arrayList.add(s2);
        arrayList.add(s3);

        Iterator<Student> iterator = arrayList.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

(4) 列表迭代器遍历
  • 正序遍历:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;

public class demo {
    public static void main(String[] args) {
        Student s1 = new Student("刘德华",22);
        Student s2 = new Student("梁朝伟",24);
        Student s3 = new Student("吴彦祖",26);

        ArrayList<Student> arrayList = new ArrayList<>();
        arrayList.add(s1);
        arrayList.add(s2);
        arrayList.add(s3);

        ListIterator<Student> iterator = arrayList.listIterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

  • 逆序遍历: 
import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;

public class demo {
    public static void main(String[] args) {
        Student s1 = new Student("刘德华",22);
        Student s2 = new Student("梁朝伟",24);
        Student s3 = new Student("吴彦祖",26);

        ArrayList<Student> arrayList = new ArrayList<>();
        arrayList.add(s1);
        arrayList.add(s2);
        arrayList.add(s3);

        ListIterator<Student> iterator = arrayList.listIterator(arrayList.size()); // 相当于把迭代器插入到 size() 位置的前面. 从这里开始遍历
        while (iterator.hasPrevious()) {
            System.out.println(iterator.previous());
        }
    }
}

[注]: 这里我们需要注意一点:  给 listIterator() 传参数 就表示将迭代器插入到index位置的前面

 所以这里给listIterator() 传了一个arrayList.size(), 就相当于把迭代器插入到了 size() 位置的前面

4. 判断

(1) cotains()
public class demo1 {
    public static void main(String[] args) {
        Student s1 = new Student("刘德华",22);
        Student s2 = new Student("梁朝伟",24);
        Student s3 = new Student("吴彦祖",26);

        ArrayList<Student> arrayList = new ArrayList<>();
        arrayList.add(s1);
        arrayList.add(s2);
        arrayList.add(s3);

        System.out.println(arrayList.contains(new Student("吴彦祖", 26)));
        System.out.println(arrayList.contains(new Student("周润发", 50)));
    }
}

(2) containsAll()
import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;

public class demo1 {
    public static void main(String[] args) {
        Student s1 = new Student("刘德华",22);
        Student s2 = new Student("梁朝伟",24);
        Student s3 = new Student("吴彦祖",26);

        ArrayList<Student> arrayList = new ArrayList<>();
        arrayList.add(s1);
        arrayList.add(s2);
        arrayList.add(s3);

        ArrayList<Student> arrayList1= new ArrayList<>();
        arrayList1.add(s1);
        arrayList1.add(s2);
        System.out.println(arrayList.containsAll(arrayList1));
    }
}

(3) isEmpty()

判断当前顺序列表是否为空.

import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;

public class demo1 {
    public static void main(String[] args) {
        Student s1 = new Student("刘德华",22);
        Student s2 = new Student("梁朝伟",24);
        Student s3 = new Student("吴彦祖",26);

        ArrayList<Student> arrayList = new ArrayList<>();
        arrayList.add(s1);
        arrayList.add(s2);
        arrayList.add(s3);

        System.out.println(arrayList.isEmpty());
        arrayList.clear();
        System.out.println(arrayList.isEmpty());
    }
}

5. 获取子列表

ArrayList中, 获取一个顺序列表的子列表, 需要使用 subList() 方法

subList() 方法, 参数传一个区间(左闭右开), 表示要获取的子列表的区间.

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

public class demo1 {
    public static void main(String[] args) {
        Student s1 = new Student("刘德华",22);
        Student s2 = new Student("梁朝伟",24);
        Student s3 = new Student("吴彦祖",26);
        Student s4 = new Student("大师",99);

        ArrayList<Student> arrayList = new ArrayList<>();
        arrayList.add(s1);
        arrayList.add(s2);
        arrayList.add(s3);
        arrayList.add(s4);
        System.out.println(arrayList);

        List<Student> sl = arrayList.subList(1,3); //获取区间[1,3) 左闭右开.
        System.out.println(sl);
    }
}

6. 获取下标

ArrayList中, 获取下标使用 indexOf() 方法:

public class demo2 {
    public static void main(String[] args) {
        Student s1 = new Student("刘德华",22);
        Student s2 = new Student("梁朝伟",24);
        Student s3 = new Student("吴彦祖",26);
        Student s4 = new Student("大师",99);

        ArrayList<Student> arrayList = new ArrayList<>();
        arrayList.add(s1);
        arrayList.add(s2);
        arrayList.add(s3);
        arrayList.add(s4);
        
        System.out.println(arrayList.indexOf(s2));
        System.out.println(arrayList.indexOf(s3));
    }
}

三. 模拟实现 ArrayList

我们知道, Arraylist底层是基于数组实现的. 所以, 我们在模拟实现Arraylist的时候,, 就需要先创建于一个数组, 然后基于数组实现我们自己的Arraylist.

为了实现起来简单, 我们自己实现ArrayList只能存放 int 类型的元素.

public class MyArrayList {
    public int[] elem; //定义一个操作数组
    public int usedSize; //定义一个 "已使用空间"
    public MyArrayList() {
        this.elem = new int[10];
    }
}

如上图, 这是就是模拟顺序列表中的属性, 一个是数组elem(在创建对象时 被初始化为10) , 另一个是usedSize, 表示已使用空间 (也就是数组中的元素个数 / 数组的长度).

还有一个问题, 因为我们验证我们写的方法是否正确时 要打印数组, 所以我们还需要重写一下 toString 方法, 否则打印出来的一堆哈希码, 没有可读性.

    @Override
    public String toString() {
        String str = "";
        for (int i = 0; i < size(); i++) {
            if (i == 0){
                str += "[";
                str += elem[i];
                str += ",";
                continue;
            }
            if (i == size()-1) {
                str += elem[i];
                str += "]";
                continue;
            }
            str += elem[i];
            str += ",";
        }
        return str;
    }

1. 模拟实现添加元素

判满方法:

    private boolean isFull () {
        if (usedSize == elem.length) {
            return true;
        }
        else {
            return false;
        }
    }
(1) 添加元素到末尾 
public void add(int data) { //添加元素到末尾.
        if (this.isFull()) { //如果数组满了, 对数组进行扩容.
            elem = Arrays.copyOf(elem, 2*elem.length);
        }
        elem[usedSize] = data;
        usedSize ++;
    }

先判断数组是不是满了: 如果满了, 就扩容; 如果没满, 就进行添加元素操作.

(2) 添加元素到指定位置
public void add(int index, int data) { // 添加元素到指定位置.
        if (this.isFull()) {
            elem = Arrays.copyOf(elem, 2*elem.length);
        }
        for (int i = size()-1; i >= index; i--) {
            elem[i+1] = elem[i]; // 把元素向后移一位.(把i位置的元素赋到它后面的位置)
        }
        elem[index] = data;
        usedSize++;
    }

 相同地, 我们还是先判断是不是数组满的: 如果满了, 就扩容; 如果没满, 就进行添加元素操作.

这里由于是添加到指定位置, 所以原先在指定位置的元素及其后面的所有元素就需要后移.

2. 模拟实现删除元素

获取列表长度方法:

  public int size() { // 求当前顺序表的长度.
        return this.usedSize;
    }
(1) 根据值删除元素
   public void remove (int data) {  //根据值删除元素
        for (int i = 0; i < size(); i++) { //先找到指定元素的下标
            if (elem[i] == data) {
                for (int j = i; j < size()-1; j++) {
                    elem[j]= elem[j+1]; // 往前覆盖掉elem[i].
                }
                usedSize--;
            }
        }
    }

这里需要注意的点是: 删除元素 就是把指定元素的位置覆盖掉就可以了.

(2) 根据下标删除元素
    public void  removeIndex (int index) { // 根据下标删除元素
        for (int j = index; j < size()-1; j++) {
            elem[j] = elem[j+1];
        }
        usedSize--;
    }

3. 模拟实现判断

(1) contains
public boolean contains(int data) { // 判断是否包含指定元素data
        for (int i = 0; i < size(); i++) {
            if (elem[i] == data) {
                return true;
            }
        }
        return false;
    }
(2) isEmpty()
public boolean isEmpty() {  //判断当前顺序列表是否为空
        if (this.usedSize == 0) {
            return true;
        }
        else {
            return false;
        }
    }
(3) clear()
public void clear() { // 清空当前顺序列表.
        this.usedSize = 0;
    }

4. 验证是否正确

public class Main {
    public static void main(String[] args) {
        MyArrayList myArrayList = new MyArrayList();

        //1. 验证add (添加到元素末尾)
        myArrayList.add(1);
        myArrayList.add(1);
        myArrayList.add(2);
        myArrayList.add(3);
        myArrayList.add(4);
        myArrayList.add(5);
        System.out.println(myArrayList);

        //2. 验证 add (添加到指定位置)
        myArrayList.add(2,99);
        System.out.println(myArrayList);

        //3. 验证 remove (根据值删除元素)
        myArrayList.remove(2);
        System.out.println(myArrayList);

        //4. 验证 remove (根据下标删除元素)
        myArrayList.removeIndex(1);
        System.out.println(myArrayList);

        //5. 验证 contains
        System.out.println(myArrayList.contains(99));

        //6. 验证 isEmpty() 和 clear()
        System.out.println(myArrayList.isEmpty());
        myArrayList.clear();
        System.out.println(myArrayList.isEmpty());
    }
}

通过打印结果我们发现, 我们模拟实现的 ArrayList 没有任何问题~~ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2264748.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ubuntu22.04安装PaddleX3

PaddleOCR 安装过程可以参考PaddleX本地安装教程 我的电脑环境配置&#xff1a; ubuntu22.04 cuda11.8&#xff08;之前安装的是12.4没有匹配的paddle-gpu;这里改成11.8&#xff09; 一、安装基础环境 1、 conda create -n ppx1 python3.10 2、 conda activate ppx1 3、…

圣诞快乐(h5 css js(圣诞树))

一&#xff0c;整体设计思路 圣诞树h5&#xff08;简易&#xff09; 1.页面布局与样式&#xff1a; 页面使用了全屏的黑色背景&#xff0c;中央显示圣诞树&#xff0c;树形由三层绿色的三角形组成&#xff0c;每一层的大小逐渐变小。树干是一个棕色的矩形&#xff0c;位于三角…

行业观察|西门子收购Altair:从多学科仿真到工业元宇宙

在当今数字化时代&#xff0c;工业领域正经历着深刻的变革。而CAE软件作为工业领域关键工具&#xff0c;在产品设计、验证和优化等环节发挥着越来越重要的作用。 11月&#xff0c;西门子宣布收购Altair的新闻屠版了整个朋友圈&#xff0c;无疑验证了CAE在制造业的核心地位。对A…

【Verilog】UDP用户原语

User-defined primitives 概述基本语法组合逻辑的UDP时序逻辑的UDPUDP 符号表 Verilog HDL&#xff08;简称 Verilog &#xff09;是一种硬件描述语言&#xff0c;用于数字电路的系统设计。可对算法级、门级、开关级等多种抽象设计层次进行建模。 Verilog 不仅定义了语法&…

计算机网络压缩版

计算机网络到现在零零散散也算过了三遍&#xff0c;一些协议大概了解&#xff0c;但总是模模糊糊的印象&#xff0c;现在把自己的整体认识总结一下&#xff0c;&#xff08;本来想去起名叫《看这一篇就够了》&#xff0c;但是发现网上好的文章太多了&#xff0c;还是看这篇吧&a…

单元测试使用记录

什么是单元测试 简单来说就是对一个类中的方法进行测试&#xff0c;对输出的结果检查判断是否符合预期结果 但是在多年的工作中&#xff0c;从来没有哪个项目中真正系统的用到了单元测试&#xff0c;因此对它还是很陌生的&#xff0c;也就造成更加不会在项目中区使用它。 如何…

bridge between Lua world and the .NET

一、新建项目&#xff1a;luademo 安装包&#xff1a;<PackageReference Include"NLua" Version"1.7.3" /> using NLua; using System;namespace luademo {internal class Program{static void Main(string[] args){Lua state new Lua();for (int …

路径规划之启发式算法之二十三:免疫算法(Immune Algorithm,IA)

免疫算法(Immune Algorithm,IA)是基于人工免疫系统的理论,受生物免疫系统的启发而推出的一种新型的智能搜索算法。通过模拟生物免疫系统的工作原理来解决优化问题。 一、定义与原理 免疫算法是以人工免疫系统的理论为基础,实现了类似于生物免疫系统的抗原识别、细胞分化、…

2.5.1 文件管理基本概念

文章目录 文件文件系统文件分类 文件 文件&#xff1a;具有符号名&#xff0c;逻辑上有完整意义的一组相关信息的集合。 文件包含文件体、文件说明两部分。文件体存储文件的真实内容&#xff0c;文件说明存放操作系统管理文件所用的信息。 文件说明包含文件名、内部标识、类型、…

C#调用WebService的方法

一、前言 在日常工作中&#xff0c;如果涉及到与第三方进行接口对接&#xff0c;有的会使用WebService的方式&#xff0c;这篇文章主要讲解在.NET Framework中如何调用WebService。 1.创建WebService &#xff08;1&#xff09;新建项目——模板选择ASP.NET Web 应用程序 &a…

(免费源码)基于springboot的电影院订票系统设计与实现 计算机毕业设计 P10089

项目说明 本号所发布的项目均由我部署运行验证&#xff0c;可保证项目系统正常运行&#xff0c;以及提供完整源码。 如需要远程部署/定制/讲解系统&#xff0c;可以联系我。定制项目未经同意不会上传&#xff01; 项目源码获取方式放在文章末尾处 注&#xff1a;项目仅供学…

python 定时任务管理封装

主逻辑代码 # -*- coding: utf-8 -*- # import apscheduler import pandas as pd from datetime import datetime # 导入调度器&#xff0c;此处使用BackgroundScheduler阻塞调度器 from apscheduler.schedulers.background import BackgroundScheduler # 导入触发器&#xf…

国标GB28181协议平台Liveweb:搭建建筑工地无线视频联网监控系统方案

随着科技高速发展&#xff0c;视频信号经过数字压缩&#xff0c;通过互联网宽带或者移动4G网络传递&#xff0c;可实现远程视频监控功能。将这一功能运用于施工现场安全管理&#xff0c;势必会大大提高管理效率&#xff0c;提升监管层次。而这些&#xff0c;通过Liveweb监控系统…

C++----------函数的调用机制

栈帧的创建与销毁 栈帧创建过程 当一个函数被调用时&#xff0c;系统会在程序的栈空间中为该函数创建一个栈帧。首先&#xff0c;会将函数的返回地址&#xff08;即调用该函数的下一条指令的地址&#xff09;压入栈中&#xff0c;这确保函数执行完后能回到正确的位置继续执行后…

【Leetcode】855. 考场就座

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接&#x1f517; 在考场里&#xff0c;有 n n n 个座位排成一行&#xff0c;编号为 0 0 0 到 n − 1 n - 1 n−1。 当学生进入考场后&#xff0c;他必须坐在离最近的人最远的座位上。如果有多个…

Unity引擎学习总结------动画控件

左侧窗格可以在参数视图和图层视图之间切换。参数视图允许您创建、查看和编辑动画控制器参数。这些是您定义的变量&#xff0c;用作状态机的输入。要添加参数&#xff0c;请单击加号图标并从弹出菜单中选择参数类型。要删除参数&#xff0c;请在列表中选择该参数并按删除键&…

UE4_用户控件_1_滑块控制图像颜色的变化

祝愿大美兰陵越来越好&#xff0c;祝愿祖国繁荣昌盛&#xff0c;祝愿人民幸福安康&#xff01; 一、样式展示&#xff1a; 效果&#xff0c;当角色靠近物体&#xff08;只有一个胶囊碰撞体&#xff09;时显示用户控件&#xff0c;调整控件中的滑块值&#xff0c;可以改变UE4lo…

网络编程 02:IP 地址,IP 地址的作用、分类,通过 Java 实现 IP 地址的信息获取

一、概述 记录时间 [2024-12-18] 前置文章&#xff1a;网络编程 01&#xff1a;计算机网络概述&#xff0c;网络的作用&#xff0c;网络通信的要素&#xff0c;以及网络通信协议与分层模型 本文讲述网络编程相关知识——IP 地址&#xff0c;包括 IP 地址的作用、分类&#xff…

【pycharm】远程服务器之后如何打开终端

【pycharm】远程服务器之后如何打开终端 在pycharm中&#xff0c;我们通过远程连接服务器&#xff0c;此时如果我们需要在终端运行的话&#xff0c;并不能直接在本地终端运行&#xff0c;而是需要连接到服务器终端才能运行命令 设置如下&#xff1a; 输入服务器的ip、端口、…

C#+OpenCv深度学习开发(常用模型汇总)

在使用 OpenCvSharp 结合深度学习进行机器视觉开发时&#xff0c;有许多现成的模型可以使用。以下是一些常用的深度学习模型&#xff0c;适用于不同的机器视觉任务&#xff0c;包括物体检测、图像分类和分割等。 使用示例 在 OpenCvSharp 中加载和使用这些模型的基本示例&…