Collection 单列集合 List Set

集合概念

集合是一种特殊类 ,这些类可以存储任意类对象,并且长度可变, 这些集合类都位于java.util中,使用的话必须导包

按照存储结构可以分为两大类 单列集合 Collection 双列集合 Map 两种 区别如下

Collection 单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的的子接口, List Set

`List` 接口 特点是元素有序可重复 它的实现类有  **ArrayList  LinkedList**

`Set` 接口 特点是元素无序且不可重复它的实现类有 HashSet  TreeSet

Map 双列集合类的根接口, 用于存储具有 键(Key) 值(Value) 隐射关系的元素,每个元素都包 含一对键值 ,其中键值不可重复且每个键 最多只能映射到到一个值,在使用Map集合时 可以通过指定的Key找到对应的Value,通一个人的学号找到学生的名字一样没有爸爸接口,只要爷爷接口Mpa 实现类有 HashMap TreeMap

Collection 单列集合根接口

单列集合的父接口,它定义了单例集合(List Set) 通用的一些方法,这样方法可用于操作所有的单列集合 ,,在开发中,往往很少直接使用 Collcetion 接口进行开发基本上都是使用其子接口,子接口主要有 List、Set、Queue和 SortedSeto

常用API

List接口

List接口继承父接口Collection 接口 ,是单列集合的一个重要分支,它允许出现重复的元素,所有元素都是以一种线性的方式存储的,通过索引访问List

集合中的指定元素,它的特点是有序** 即元素 存入和取出的 顺序一致**

List集合常用方法,上方父接口 Collection方法同样可以继承使用

List 的所有实现类都可以通过调用这些方法操作集合元素

方法声明

功能描述

void add ( int index, Object element )

将元素 element 插入在List 集合的index处

boolean addAll ( int index, Collection c )

将集合所包含的所有元素插入到List集合的index处

Object get ( int index )

返回集合索引inde处的元素

Object remove ( int index )

删除集合索引inde处的元素

Object set ( int index, Object element

将集合索引indx处 元素替换成element对象,并将替换后的元素返回

int indexOf ( Object o )

返回对象o在List集合中出现的位置索引

int lastlndexOf ( Object o )

返回对象o在List集合中最后一次出现的位置索引

List subList ( int fromlndex, int tolndex )

返回从索引 fromindex(包括) 到toindex(不包括) 处所有元素组成的子集合

ArrayList实现类 查询 有序可重复

ArrayListList 接口的一个实现类,它是程序中一种常见的集合,在ArrayList内部封装了一个长度可变的数组对象,当存入的元素

超过数组长度时 ArrayList会在内存中分配一个更大的数组来存储这些元素,因此可以将ArrayList集合看作一个长度灵活可变的数组

它的大部分方法都是继承父类CollectionList接口的 其中 add()方法 和 get() 分别实现元素的存入和取出

import java.util.ArrayList;

public class h {
    public static void main(String[] args) {
        ArrayList List = new ArrayList(); // 创建 ArrayList集合 相当于实现了List接口
        List.add(3);
        List.add("你好");
        List.add("世界");
        // 获取集合中元素的个数  size()方法是 Collection的
        System.out.println("集合的长度:"+List.size());
        // 取出并打印指定位置的元素 通过索引查找和数组一样从 0开始
        // 访问元素索引最好不要超过范围,否则会出现角标越界异常
        System.out.println("第2个元素是:"+List.get(1));
    }
}


---------------------------------------------

输出:

集合的长度:3
第2个元素是:你好

注意 :

由于Aaytist 集合的底层使用一个数组来保存元素,在增加或删除指定位置的元素时,会创建新的数组,效率很低 因此不适合大量的增加删除操作,

因为这种数组的结构允许程序通过索引的方式来访问问元素,所以 ArrayList集合查找元素很方法

LinkedList实现类 增删 有序可重复

LinkedList集合内部维护了一个双向循环表,链表中的每一个元素都使用了引用的方式来记住它的前一个元素或后一个元素,从而可以将所有的元素彼此连接起来,LikedList 集合进行元素的增加删除操作时效率很高,

常用方法

import java.util.LinkedList;

public class g {
    public static void main(String[] args) {
        LinkedList link = new LinkedList(); // 创建了LinkeduList集合
        link.add(3);
        link.add("你好");
        link.add("世界");
        System.out.println(link.toString()); //取出并打印该集合的元素转换为字符串输出
        System.out.println(link);  // 同样取出元素直接输出对象
        // 上面两个的区别在于两个打印语句的结果是相同的,只是输出格式不同。
        link.add(3,"saber"); // 向该集合中指定位置插入元素
        link.addFirst("插入");     // 向该集合第一个位置插入元素
        System.out.println(link.getFirst()); // 取出该集合中的第一个元素 插入
        link.remove(2); // 删除该集合中指定位置的元素 按照数组索引来 所以是第三个 看清楚
        System.out.println("会输出"+link);
        link.removeFirst(); // 删除该集合中的第一个元素
        System.out.println(link);
    }
}


使用 LinkedList 对元素进行增加和删除操作是非常便捷的

----------------------------------------------

输出:

[3, 你好, 世界]
[3, 你好, 世界]
插入
会输出 [插入, 3, 世界, saber]
[3, 世界, saber]

lterator接口 遍历迭代器

接口Iterator 接口也是集合中的一员, 但是它与 Collection Map 有所不同, Collection接口和Map 接口主要是用于存储元素 而

Iteratore 主要用于迭代访问(即遍历) Collection 中的元素,因此 Iteratior对象也称迭代器

代码含义:

hasNext()方法用于判断集合中是否还有下一个元素,如果有则返回true,否则返回false。如果返回true,
则可以使用next()方法取出下一个元素,并将其赋值给一个Object类型的变量obj。最后,使用System.out.println()方法将obj打印出来。
整个过程会一直重复,直到集合中的所有元素都被遍历完毕。因此,这段代码的作用是遍历ArrayList集合中的所有元素,并将它们打印出来。

注意:

通过next()方法获取元素时 必须保证获取元素的存在,否则会抛出 NoSuchElementException 异常  (无搜索元素异常)

---------------------------------------------

import java.util.ArrayList;
import java.util.Iterator;
public class f {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add("张三");  // 存入了集合就必须使用 Object类型接收
        list.add("李四");
        list.add("王五");
        list.add("赵六"); 
        // 每一个集合迭代前都是必须通过下面的代码来获取迭代器
        Iterator it = list.iterator(); // 获取迭代器对象
        while (it.hasNext()){  // 判断ArrayList集合 是否存在下一个元素
            Object obj = it.next(); // 取出ArrayList集合中的元素 赋值给新的对象 obj
            System.out.println(obj); // 依次打印出全部的时间
        }
    }
}



-----------------------------------------------

输出:

张三
李四
王五
赵六
迭代判断删除

使用迭代器对集合中的元素进行迭代时, 如果调用了集合对象的 remover() 方法删除元素,那么继续使用迭代器会出现异常,下面通过案例来演示说明

import java.util.Locale;

public class e {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        list.add("赵六");
        Iterator it = list.iterator(); // 获取迭代器对象
        while (it.hasNext()){  // 判断ArrayList集合 是否存在下一个元素
            Object obj = it.next(); // 取出ArrayList集合中的元素
            if ("张三".equals(obj))
            list.remove(obj); // 删除后就也就不再继续
        }
        System.out.println(list); // 删除的是没有张三的集合
    }
}

上述代码会报出错误,原因是迭代器在运行期间删除了元素,导致迭代次数发生了变化,迭代结果不准确,解决方案

(1) 找到对应的名称字符删除后就使用 breack语句跳出循环不再继续迭代,

while (it.hasNext()){  // 判断ArrayList集合 是否存在下一个元素
            Object obj = it.next(); // 取出ArrayList集合中的元素
            if ("张三".equals(obj))
            list.remove(obj); // 删除后就也就不再继续
            break;

(2) 使用迭代器本身的删除方法去进行删除,删除后所导致的迭代次数变化,对于迭代器本身是可预测的

while (it.hasNext()){  // 判断ArrayList集合 是否存在下一个元素
            Object obj = it.next(); // 取出ArrayList集合中的元素
            if ("张三".equals(obj))
            list.remove(); // 删除后就也就不再继续
        }
foreach 循环

Iterator 虽然可以遍历集合中的元素,但是写法比较繁琐,简化书写提供了 foreach 循环,也称 增强for 循环, 它可以遍历数组或集合中的元素

语法格式:

for(容器中元素类型 临时变量: 容器变量){
  执行语句
}

和for循环相比foreach不再需要获得容器的长度,也不再需要根据索引访问,它会根据索引去访问容器的元素 
`并且自动遍历容器中的每个元素`
import java.util.ArrayList;
public class foreach {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        list.add("赵六");
     for (Object obj:list){// 循环遍历ArrayList
         System.out.println(obj); // 取出
     }
    }
}


--------------------------------

输出:

张三
李四
王五
赵六
循环局限性

当使用foreach 循环遍历集合和数组时,只能访问集合中的元素,不能对其中的元素进行修改, 下面是一个String 类型的数组,演示 foreach 局限性

public class foreach {
    static String[]  strrs = {"aaa","ddd","ccccc"};
    public static void main(String[] args) {
     // foteach 遍历数组
        for(String  str: strrs){
            str="ddd";
        }
        System.out.println("foreach循环修改后的数组"+strrs[0]+","+strrs[1]+","+strrs[2]);
        // for循环遍历数组
        for (int i= 0;i<strrs.length;i++){
            strrs[i]="ddd"; // 修改数据
        }
        System.out.println("循环修改后的数组"+strrs[0]+","+strrs[1]+","+strrs[2]);
     }
}


-----------------------------------

输出:

foreach循环修改后的数组aaa,ddd,ccccc
循环修改后的数组ddd,ddd,ddd

foreach循环str=“ddd” 只是将临时的变量指向一个新的字符串并不能修改元素,for循环则是可以通过索引的方式对数组中的元素进行修改的

Set接口

Set接口和List接口一样,同样继承Collection 接口,方法和他基本一致, 功能上并没有扩充,反而更加严格,它的List接口不同在于, Set接口元素无序且不重复

实现类

  • **HashSet **: 根据对象的散列值来确定元素在集合中存储的位置,具有良好的存取和查找功能
  • TreeSet : 以二叉树方式存储元素,它可以实现对元素的排序
HashSet *实现类无序无重复

存储元素不可重复 意味着没有相同的,并且元素无序

import java.util.HashSet;
import java.util.Iterator;

public class foreach {
    static String[]  strrs = {"aaa","ddd","ccccc"};
    public static void main(String[] args) {
        HashSet set = new HashSet(); // 创建HashSet集合
        set.add("张三"); //  向集合中添加元素
        set.add("李四");
        set.add("王五");
        set.add("王五"); // 添加重复元素
        Iterator it = set.iterator(); // 获取迭代器接口
        while (it.hasNext()){ // while 判断集合是否有元素
            Object obj = it.next(); // 如果有元素则通过迭代器 next() 获取元素
            System.out.println(obj); // 打印获取到的元素
        }
     }
}


-----------------------------------------------


输出:

李四
张三
王五

注意:

取出元素和添加元素并不一致,并且重复添加的元素只出现了一次,它之所以可以确保不出现重复的元素,做了很多工作, add 添加元素时,首先调用存入对象的 hashCode() 方法获得对象的散列值,然后根据元素的散列值计算出特有的存储位置**, 散列值还是看数据类型是否相等的**, 只要数据类型相等,里面数字相等那么就是一样的,如果出现 String 字符串的100 和 int 类型的 100 其实是不同的,因为数据类型不同,并且 equals使用的前提也是相同数据类型比较字符串类型一致,详见String字符串 Random数字运算、

上面是不相同的情况,相同情况则是计算哈希后,进行equals 比较,如果比较存在,则是舍弃 没有则是加入

import java.util.HashSet;
import java.util.Iterator;

public class foreach {
    static String[]  strrs = {"aaa","ddd","ccccc"};
    public static void main(String[] args) {
        HashSet set = new HashSet(); // 创建HashSet集合
        set.add("张三"); //  向集合中添加元素
        set.add("李四");
        set.add("王五");
        set.add("王五"); // 添加重复元素
        set.add("100");  // 两个类型不同
        set.add(100); // 两个类型不同
        Iterator it = set.iterator(); // 获取迭代器接口
        while (it.hasNext()){ // while 判断集合是否有元素
            Object obj = it.next(); // 如果有元素则通过迭代器 next() 获取元素
            System.out.println(obj); // 打印获取到的元素
        }
     }
}


------------------------------------

两个内容相同类型不同,散列值也是不同 会保存下来

输出:

李四
100
张三
100
王五
HashSet 存储Class类

将字符串存入HshSet时 String类已经重写了hashCodeequals 方法,下面演示存储自定义的Class类 的结果

未改写 hashCode和equals()方法

import java.util.HashSet;
class  Student{
    String id;
    String name;

    public Student(String id, String name) { // 创建构造方法
        this.id = id;
        this.name = name;
    }
    public String toString(){
        return  id+":"+name;
    }
}
public class foreach {
    static String[]  strrs = {"aaa","ddd","ccccc"};
    public static void main(String[] args) {
        HashSet set = new HashSet(); // 创建HashSet集合
        Student stu1 = new Student("1","杜甫");  // 创建对象传入参数到构造函数中
        Student stu2 = new Student("2","李白");
        Student stu3 = new Student("2","李白");
        set.add(stu1); // 将对象的值传入到集合中 也就是传入 class
        set.add(stu2);
        set.add(stu3);
        System.out.println(set);
     }
}


---------------------------------------------

输出:

[2:李白, 2:李白, 1:杜甫]



**注意:**

在Java中,当我们使用System.out.println()方法输出一个对象时,实际上会自动调用该对象的`toString`()方
法来获取其字符串表示形式。因此,在这段代码中,当我们使用System.out.println(set)输出HashSet对象时
实际上会自动调用每个Student对象的toString()方法来获取其字符串表示形式,并将它们拼接成一个字符串输
出。虽然你没有显式调用toString()方法,但它确实被隐式调用了。 所以上面代码我们没有调用实际上啊是自动
调用了

----------------------------------------------------------

运行结果出现了两个相同的李白2,本来应该被认为是重复元素,不允许输出的,为什么没有去掉是因为在定义
Class类时 没有重写hashCode和equals()方法

已改写 hashCode和equals()方法

import java.util.HashSet;
     class  Student{
     String id;
     String name;
     public Student(String id, String name) { // 创建构造方法
     this.id = id;
     this.name = name;
      }
    public String toString(){  // 重写toSring() 方法
      return  id+":"+name;
     }
     public int hashCode(){  // 重写了hashCode()
            return  id.hashCode();
        }
        // 重写 eqlals 方法
        public boolean equals(Object obj){
            if (this==obj){  // 判断是否是同一个对象
                return true; // 是的话就是真
            }
            if (!(obj instanceof  Student)){ // 判断对象是否是Student类型
                return  false;
            }
            Student  stu = (Student) obj; // 将对象强制转换为 Student 类型
            boolean b = this.id.equals(stu.id); // 判断id值是否相同
            return  b;
        }
    }
    public class foreach {
        static String[]  strrs = {"aaa","ddd","ccccc"};
        public static void main(String[] args) {
            HashSet set = new HashSet(); // 创建HashSet集合
            Student stu1 = new Student("1","杜甫");  // 创建对象传入参数到构造函数中
            Student stu2 = new Student("2","李白");
            Student stu3 = new Student("2","李白");
            set.add(stu1); // 将对象的值传入到集合中
            set.add(stu2);
            set.add(stu3);
            System.out.println(set);
         }
    }
    

----------------------------------------

输出:

[1:杜甫, 2:李白]


**注意:**

Student类重写了Object类的hashCode()返回`id`属性的散列值还有`equals` 并且在`equals` 方法比较对象
的id属性值是否相等并返回结果`HashSet`集合添加元素时,因为改写了`hashCode`方法所以`add`添加时
会进行比较发现散列值相同而且**stue.equsls(stu3)** 返回true 集合认为两个参数相等因为重复的被去掉了
LinkedHashSet实现类存取有序无重复

HashSet集合存储的元素是无序的,如果想让元素存取顺序一致,那么就使用 LinkedHashSet

它是HashSet 的子类,它和LinkdList一样 使用双向链表来维护内部元素关系

import java.util.Iterator;
import java.util.LinkedHashSet;

public class foreach {
        public static void main(String[] args) {
            LinkedHashSet set = new LinkedHashSet();
            set.add("张三"); // 集合添加元素
            set.add("李四");
            set.add("王五");
            set.add("王五"); // 即使出现重复元素 也还是会显示一个
            Iterator it = set.iterator(); // 迭代器判断
            while (it.hasNext()){ // 循环判断是否有元素
                Object obj = it.next();
                System.out.println(obj);
            }
         }
    }

-------------------------------------------------

输出:

张三
李四
王五

TreeSet 实现类有序无重复

为了对集合的元素进行排序,Set 接口提供了另一个可以对HashSet集合中元素排序的类——TreeSet

import java.util.TreeSet;

public class foreach {
        public static void main(String[] args) {
            TreeSet set = new TreeSet();
            set.add(1);
            set.add(1);
            set.add(3);
            set.add(5);
            set.add(6);
            System.out.println(set);
         }
}


----------------------------------------------

输出:

[1, 3, 5, 6]

元素会自动排序并且没有存在重复

TreeSet 集合之所以可以对添加元素排序,是因为元素的类实现了`Comparable`接口 
(基本类型的包装类 String类都实现了该接口) `Comparable`强行对实现它的每个类的对象进行整体排序
 这种排序被称为自然排序Comparable接口的compareTo()方法被称为自然比较方法!

什么是comparTo()方法

Comparable接口是Java中的一个接口,用于实现对象之间的比较。其中,compareTo()方法是Comparable接口中的一个方法,用于比较当前对象与另一个对象的大小关系。

compareTo()方法的返回值为int类型,表示当前对象与另一个对象的大小关系。如果当前对象小于另一个对象,则返回负整数;如果当前对象等于另一个对象,则返回0;如果当前对象大于另一个对象,则返回正整数。

compareTo()方法的作用是用于实现对象之间的排序。在Java中,如果一个类实现了Comparable接口,就可以使用Collections.sort()方法或Arrays.sort()方法对该类的对象进行排序。在排序过程中,会调用compareTo()方法来比较对象之间的大小关系,从而实现排序。

需要注意的是,如果一个类实现了Comparable接口,就必须实现compareTo()方法,否则会编译错误。另外,compareTo()方法的实现应该满足一定的规则,例如具有传递性、反对称性等,否则可能会导致排序结果不正确

TreeSet 存储Class类

如果同HashSet()一样存储Class类,TreeSet集合不会去进行排序,Class类对象必须实现 Comparable

接口并重写 compareTo方法实现对象元素的顺序存取 想对添加的元素进行排序就先重写

import java.util.TreeSet;

// 定义Student类  **第一步实现了Comparable泛型;**
class Student implements Comparable<Student>{
    private String id;
    private String name;

    public Student(String id, String name) {
        this.id = id;
        this.name = name;
    }
    // 重写toString字符串方法
    public String toString(){
        return id+":"+name;
    }
    // **第二步重写 compareTo方法**
    //  三种compareTo方法的三种情况 
    public int compareTo(Student o){
         return 0 ;   // 集合中只有一个元素 还是第一个张三
        // return  1  // 集合怎么存怎么取的顺序
//        return -1;   // 集合按照存入的元素进行倒序
    }
}
public class foreach {
        public static void main(String[] args) {
            TreeSet set = new TreeSet();
            set.add(new Student("1","张三")); // 直接打印省去了 stu1 stu2 操作
            set.add(new Student("2","李白"));
            set.add(new Student("3","毒品"));
            System.out.println(set);
         }
}


---------------------------------------------

输出:

return 0  

[1:张三]

return 1 

[1:张三, 2:李白, 3:毒品]


return -1

[3:毒品, 2:李白, 1:张三]

除了自然排序还有另一种排序方法; 即实现Comparator接口 重写compare()方法 equals()方法

但是由于所有的类默认继承Object 而Object 又存在 equals() 所以自定义比较器类时,不用重写equals方法,只需要重写compare() 方法这种排序称为比较器排序

通过自定义Class类对象 通过比较器存入TreeSet集合

import java.util.Comparator;
import java.util.TreeSet;

class Student {
    private String id;
    private String name;

    public Student(String id, String name) {
        this.id = id;
        this.name = name;
    }
    // 重写toString字符串方法
    public String toString(){
        return id+":"+name;
    }
}
public class foreach {
        public static void main(String[] args) {
        // 声明了一个TreeSet集合并通过匿名内部类的方式实现了Comparator接口,
            TreeSet set = new TreeSet(new Comparator() {
                @Override
                
                // 然后重写了compare()方法并
                public int compare(Object o1, Object o2) {
                    return -1;
                }
            });
            set.add(new Student("1","张三")); // 直接打印省去了 stu1 stu2 操作
            set.add(new Student("2","李白"));
            set.add(new Student("3","毒品"));
            System.out.println(set);
         }
}


--------------------------------------------

输出:

[3:毒品, 2:李白, 1:张三]

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android:记录一个打包发布版的release包以后闪退的问题

个人感觉其实release闪退的问题挺难排查的&#xff0c;因为release包运行起来as捕获不到相应的应用程序进程&#xff0c;从而不易查看到日志&#xff0c;也是我玩得不溜&#xff0c;大家有不同的方法可以评论区探讨&#xff0c;我也定期回复一些评论一起讨论。以下是我遇到的情…

Scrapy | 使用Scrapy进行数据建模和请求

scrapy数据建模与请求 数据建模1.1 为什么建模1.2 如何建模1.3如何使用模板类1.4 开发流程总结 目标&#xff1a; 1.应用在scrapy项目中进行建模 2.应用构造Request对象&#xff0c;并发送请求 3.应用利用meta参数在不同的解析函数中传递数据 数据建模 | 通常在做项目的过程中…

标准IO练习及思维导图

1、完成标准io的单字符、字符串、格式化、模块化实现两个文件的拷贝&#xff1b; #include <myhead.h> typedef struct sockaddr_in addr_in_t; typedef struct sockaddr addr_t; typedef struct sockaddr_un addr_un_t; int main(int argc, const char *argv[]) {FILE*…

Kafka-设计思想-2

一、消息传递语义 现在我们对生产者和消费者的工作方式有了一些了解&#xff0c;让我们讨论一下Kafka在生产者和消费者之间提供的语义保证。 1、最多发送一次&#xff1a;会造成数据丢失 2、至少发送一次&#xff1a;会造成数据重复消费 3、只发送一次&#xff1a;我们想要的效…

docker 部署 vscode 远程开发环境(Go,Java)

1. 前言&#xff1a; 构建一个远程开发环境&#xff0c;一般来说开个linux云服务器是最好的&#xff0c;但是这里使用 docker 来搭建&#xff0c;docker 意味着更省资源&#xff0c;可以直接在一个 linux 主机上去设置 准备 一个安装了 docker 的主机&#xff0c;最好是linux&…

几何完备的3D分子生成/优化扩散模型 GCDM-SBDD - 评测

GCDM 是一个新的 3D 分子生成扩散模型&#xff0c;与之前的 EDM 相比&#xff0c;GCDM 优化了其中的图神神经网络部分&#xff0c;使用手性敏感的 SE3 等变神经网络 GCPNET 代替了 EDM 中的 EGNN&#xff0c;让节点间消息传递、聚合根据手性不同而进行。本文对 GCDM-SBDD&#…

制造企业数字化转型顶层规划案例(55页满分PPT)

基于集团的战略和运营特点&#xff0c;数字化转型应如何考虑&#xff1f; 在集团的战略和运营特点基础上进行数字化转型&#xff0c;需要实现业务多元化&#xff0c;整合资源和流程&#xff0c;推动国际化拓展&#xff0c;实施差异化战略&#xff0c;并通过数据驱动决策&#…

WPF开发一个语音转文字输入软件(一)

本文探索的Demo地址: https://gitee.com/lishuangquan1987/try_win32 https://github.com/lishuangquan1987/try_win32 后续会把他当做一个开源项目来维护 需求 开发一个软件&#xff0c;能够让用户说话来进行文字输入。具体如下&#xff1a; 像腾讯电脑管家那样的悬浮球悬浮…

Py之pygetwindow:pygetwindow的简介、安装和使用方法、案例应用之详细攻略

Py之pygetwindow&#xff1a;pygetwindow的简介、安装和使用方法、案例应用之详细攻略 目录 pygetwindow的简介 pygetwindow的安装和使用方法 pygetwindow的案例应用 1、使用了Windows系统打开了记事本应用程序&#xff0c;其窗口标题为“无标题 - 记事本” 2、Window对象…

STM32学习笔记---RTC

目录 一、什么是RTC 二、如何配置RTC 1、标准实时时钟部分(万年历部分) 1.1 时钟源分类 1.2 RTC时钟源的选择 1.3 精密校正 1.4 异步7位预分频器 1.5 粗略校正 1.6 同步15位分频 1.7 日历寄存器 1.8 RTC的初始化与配置 1.9 程序设计 2、闹钟部分 2.1 闹钟的初始化…

Python酷库之旅-第三方库Pandas(155)

目录 一、用法精讲 706、pandas.DatetimeTZDtype类 706-1、语法 706-2、参数 706-3、功能 706-4、返回值 706-5、说明 706-6、用法 706-6-1、数据准备 706-6-2、代码示例 706-6-3、结果输出 707、pandas.Timedelta.asm8属性 707-1、语法 707-2、参数 707-3、功能…

信息学CCF CSP-J/S 2024常见问题汇总,低年级考生重点关注

摘要 随着2024年CSP-J/S初赛的临近&#xff0c;各省报名要求细则陆续公布。为了帮助广大考生和家长准确了解各省政策&#xff0c;自主选拔在线团队特为汇总整理全国各省CSP-J/S2024认证相关问题&#xff0c;希望可以帮助各位考生更好的备考&#xff01; CCF CSP-J/S 2024 认证…

Android平台RTSP|RTMP播放器PK:VLC for Android还是SmartPlayer?

好多开发者&#xff0c;希望在Android端低延迟的播放RTMP或RTSP流&#xff0c;本文就目前市面上主流2个直播播放框架&#xff0c;做个简单的对比。 VLC for Android VLC for Android 是一款功能强大的多媒体播放器&#xff0c;具有以下特点和功能&#xff1a; 广泛的格式支持…

PDF-XChange PRO v10.4.2.390 x64 已授权中文特别版

PDF-XChange PRO是一款功能强大的PDF编辑和查看软件&#xff0c;PDF-XChange PRO 一个多合一的PDF解决方案。这是Tracker Software的三个最佳应用程序的套件&#xff1a;PDF-XChange Editor Plus&#xff0c;PDF-Tools和PDF-XChange Standard。使用 PDF-XChange Editor Plus&am…

vector的深入剖析与底层逻辑

前言&#xff1a; 上篇我们谈到vector的概念&#xff0c;使用&#xff0c;以及相关接口的具体应用&#xff0c;本文将对vector进行深入剖析&#xff0c;为读者分享其底层逻辑&#xff0c;讲解其核心细节。 上篇链接&#xff1a; 初始vector——数组的高级产物-CSDN博客 一.…

CDGA|数据治理:如何让传统行业实现数据智能

在当今这个数字化时代&#xff0c;数据已成为推动各行各业转型升级的关键力量。对于传统行业而言&#xff0c;如何从海量、复杂的数据中挖掘价值&#xff0c;实现“数据智能”&#xff0c;成为了提升竞争力、优化运营效率、创新业务模式的重要途径。本文将探讨数据治理如何助力…

【文献及模型、制图分享】干旱区山水林田湖草沙冰一体化保护与系统治理——基于土地退化平衡视角

文献介绍 目标明晰、统筹兼顾、干预适度是山水林田湖草沙冰一体化保护与系统治理的客观要求。基于土地退化平衡&#xff08;LDN&#xff09;视角&#xff0c;构建涵盖双重对象、双重法则、双重原则、指标体系、价值取向的理论框架&#xff0c;并以天山北坡城市群为例&#xff…

Flume抽取数据(包含自定义拦截器和时间戳拦截器)

flume参考网址&#xff1a;Flume 1.9用户手册中文版 — 可能是目前翻译最完整的版本了https://flume.liyifeng.org/?flagfromDoc#要求&#xff1a; 使用Flume将日志抽取到hdfs上&#xff1a;通过java代码编写一个拦截器&#xff0c;将日志中不是json数据的数据过滤掉&#xf…

模拟退火算法最常见知识点详解与原理简介控制策略

章节目录 模拟退火算法简介与原理 算法的基本流程与步骤 关键参数与控制策略 模拟退火算法的应用领域 如何学习模拟退火算法 资源简介与总结 一、模拟退火算法简介与原理 重点详细内容知识点总结 1. 模拟退火算法简介 模拟退火算法&#xff08;Simulated Annealing, SA&#x…

blender分离含有多个动作的模型,并导出含有材质的fbx模型

问题背景 笔者是模型小白&#xff0c;需要将网络上下载的fbx模型中的动作&#xff0c;分离成单独的动作模型&#xff0c;经过3天摸爬滚打&#xff0c;先后使用了blender&#xff0c;3d max&#xff0c;unity&#xff0c;最终用blender完成&#xff0c;期间参考了众多网络上大佬…