TreeSet的排序方式

news2024/11/24 15:35:17

一.TreeSet的特点:


二.TreeSet对象排序练习题:

需求:利用TreeSet存储整数并进行排序

package com.itheima.a06mySet;
​
import java.util.TreeSet;
​
public class A05_TreeSetDemo1 {
    public static void main(String[] args) {
        //1.创建TreeSet集合对象
        TreeSet<Integer> ts=new TreeSet<>();//注:泛型如果是基本数据类型的话要用包装类
​
        //2.添加元素
        ts.add(4);
        ts.add(5);
        ts.add(1);
        ts.add(3);
        ts.add(2);
​
        //3.打印集合
        System.out.println(ts);
        /* 运行结果为[1, 2, 3, 4, 5]
            已经排好序了,默认排序规则为从小到大
         */
    }
}
 

对刚才的集合进行遍历:

  • 迭代器:
    package com.itheima.a06mySet;
    ​
    import java.util.Iterator;
    import java.util.TreeSet;
    ​
    public class A05_TreeSetDemo1 {
        public static void main(String[] args) {
            //1.创建TreeSet集合对象
            TreeSet<Integer> ts=new TreeSet<>();//注:泛型如果是基本数据类型的话要用包装类
    ​
            //2.添加元素
            ts.add(4);
            ts.add(5);
            ts.add(1);
            ts.add(3);
            ts.add(2);
    ​
            //3.遍历集合
            Iterator<Integer> it=ts.iterator();
            while (it.hasNext()){
                Integer i = it.next();//这里i也可以用int型,因为JDK5有自动装箱和自动拆箱的功能
                System.out.print(i+",");
            }
             /* 遍历结果为
                 1,2,3,4,5,
              */
        }
    }
     
  • 增强for:
    package com.itheima.a06mySet;
    ​
    import java.util.TreeSet;
    ​
    public class A05_TreeSetDemo1 {
        public static void main(String[] args) {
            //1.创建TreeSet集合对象
            TreeSet<Integer> ts=new TreeSet<>();//注:泛型如果是基本数据类型的话要用包装类
    ​
            //2.添加元素
            ts.add(4);
            ts.add(5);
            ts.add(1);
            ts.add(3);
            ts.add(2);
    ​
            //3.遍历集合
            for (Integer t : ts) {
                System.out.print(t+",");
            }
             /* 遍历结果为
                  1,2,3,4,5,
              */
        }
    }
    ​

  • Lambda表达式:

未使用Lambda表达式前:

package com.itheima.a06mySet;
​
import java.util.TreeSet;
import java.util.function.Consumer;
​
public class A05_TreeSetDemo1 {
    public static void main(String[] args) {
        //1.创建TreeSet集合对象
        TreeSet<Integer> ts=new TreeSet<>();//注:泛型如果是基本数据类型的话要用包装类
​
        //2.添加元素
        ts.add(4);
        ts.add(5);
        ts.add(1);
        ts.add(3);
        ts.add(2);
​
        //3.遍历集合
        ts.forEach(new Consumer<Integer>() { //forEach是一个方法,底层用了增强for遍历集合
            @Override //重写了Consumer接口的抽象方法
            public void accept(Integer i) {
                System.out.print(i+",");
            }
        });
         /* 遍历结果为
               1,2,3,4,5,
          */
    }
}
使用Lambda表达式后:
package com.itheima.a06mySet;
​
import java.util.TreeSet;
​
public class A05_TreeSetDemo1 {
    public static void main(String[] args) {
        //1.创建TreeSet集合对象
        TreeSet<Integer> ts=new TreeSet<>();//注:泛型如果是基本数据类型的话要用包装类
​
        //2.添加元素
        ts.add(4);
        ts.add(5);
        ts.add(1);
        ts.add(3);
        ts.add(2);
​
        //3.遍历集合
        ts.forEach(i ->
                System.out.print(i+",")
        );
         /* 遍历结果为
               1,2,3,4,5,
          */
    }
}

三.TreeSet集合默认的规则:

1.非自定义数据类型排序:

例如字符串排序:"aaa","aba","qwer","ab","cd"

排序后为:"aaa","ab","aba","cd","qwer"(默认是升序排序)

从第一个开始比,只要发现大的就停止比较,对于"ab"和"aba","ab"前两个和"aba"一样,"ab"在第三个

比"aba"少一个字母,默认比"aba"小。

2.自定义类型排序:

如:需求:创建TreeSet集合,并添加3个学生对象

学生对象属性:姓名,年龄。

要求按照学生的年龄进行排序

同年龄按照姓名字母排列(暂不考虑中文)

同姓名,同年龄认为是同一个人

错解:

Student类:

package com.itheima.a06mySet;
​
public class Student {
    private String name;
    private int age;
​
​
    public Student() {
    }
​
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
​
    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }
​
    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }
​
    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }
​
    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }
​
    public String toString() {
        return "Student{name = " + name + ", age = " + age + "}";
    }
}

测试类:

package com.itheima.a06mySet;
​
import java.util.TreeSet;
​
public class A05_TreeSetDemo2 {
    public static void main(String[] args) {
        //1.创建3个学生对象
        Student s1=new Student("zhangsan",23);
        Student s2=new Student("lisi",24);
        Student s3=new Student("wangwu",25);
​
        //2.创建集合对象
        TreeSet<Student> ts=new TreeSet<>();
​
        //3.添加元素
        ts.add(s1);
        ts.add(s2);
        ts.add(s3);
​
        //4.打印集合
        System.out.println(ts);
    }
}
​

打印结果会报错,因为s1,s2和s3都是自定义的类型,此时没有指明比较规则,添加元素的时候也就无法进行比较再添加,在添加元素时就已经出错了。


正解:需要指明比较规则。


四.TreeSet的两种比较方式:(如果两种比较方式都存在,则以方式二为准)

方式一:默认排序/自然排序Javabean类实现Comparable接口指定比较规则

接刚才的例子:需要Student类实现Comparable接口,重写里面的抽象方法,再指定比较规则

Student类:

package com.itheima.a06mySet;
​
public class Student implements Comparable<Student>{ //此时已经明确比较排序的就是Student型
     // 用了接口Comparable,本例中要写比较规则,所以重写方法
​
    private String name;
    private int age;
​
​
    public Student() {
    }
​
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
​
    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }
​
    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }
​
    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }
​
    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }
​
    public String toString() {
        return "Student{name = " + name + ", age = " + age + "}";
    }
​
    @Override
    public int compareTo(Student o) {
        //指定排序规则
        /* 只看年龄
            要按照年龄的升序进行排序
         */
        int result=this.getAge() - o.getAge();
        return result;
    }
​
    /* 不需要重写hashCode和equals方法
        因为hashCode和equals方法是和哈希表有关的
        而TreeSet底层是红黑树
     */
}
​

注:在这种重写后的方法下才有相同的不存的效果,因为底层是红黑树。自己写的一般没有相同的不存的效果。

测试类:

package com.itheima.a06mySet;

import java.util.TreeSet;

public class A05_TreeSetDemo2 {
    public static void main(String[] args) {
        //1.创建3个学生对象
        Student s1=new Student("zhangsan",23);
        Student s2=new Student("lisi",24);
        Student s3=new Student("wangwu",25);

        //2.创建集合对象
        TreeSet<Student> ts=new TreeSet<>();

        //3.添加元素
        ts.add(s3);
        ts.add(s2);
        ts.add(s1);

        //4.打印集合
        System.out.println(ts);
        /* 运行结果为
             [Student{name = zhangsan, age = 23}, Student{name = lisi, age = 24},
              Student{name = wangwu, age = 25}]
            已经指明了比较规则,此时可正常运行
         */
    }
}

解释Student类里的compareTo方法:

先添加25(s3),要变黑,因为是根节点。再添加24(s2),此时25(s3)是o,24(s2)是this:

添加后,刚好符合红黑树规则:

再添加23(s1),此时23(s1)是this。注:先和25(s3)比较,因为25(s3)是根节点(添加元素时一定是先和根节点进行比较),此时25(s3)是o。

经过比较后23(s1)存左边,但左边已经有24(s2),因此继续调用compareTo方法进行比较添加。

此时24(s2)是o,23(s1)是this-->经过比较添加后为:

但此时不符合红黑树规则,需要进行一系列改正操作。s1为非根节点,s1的父为红色,叔叔为Nil即黑色,且s1是父的左孩子,因此进行3的操作,注:祖父为s3,右旋时不考虑叶子节点,结果为:

结果中叶子节点省略了

此时根节点变为24(s2),再添加元素时就是先和根节点24(s2)比较了


代码解释:

Student类:

package com.itheima.a06mySet;

public class Student implements Comparable<Student>{ //此时已经明确比较排序的就是Student型
     // 用了接口Comparable,本例中要写比较规则,所以重写方法

    private String name;
    private int age;


    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    public String toString() {
        return "Student{name = " + name + ", age = " + age + "}";
    }

    @Override
    //this:表示当前要添加的元素
    //o:表示已经在红黑树中存在的元素
    /* 返回值:
        负数:表示当前要添加的元素是小的,就要存左边
        正数:表示当前要添加的元素是大的,就要存右边
        0:表示当前要添加的元素已经存在,此时要舍弃(因为TreeSet集合不重复)
     */
    public int compareTo(Student o) {
        System.out.println("--------------------------------------");
        System.out.println("this:"+this);
        System.out.println("o:"+o);
        //指定排序规则
        /* 只看年龄
            要按照年龄的升序进行排序
         */
        int result=this.getAge() - o.getAge();
        return result;
    }

    /* 不需要重写hashCode和equals方法
        因为hashCode和equals方法是和哈希表有关的
        而TreeSet底层是红黑树
     */
}

测试类:

package com.itheima.a06mySet;

import java.util.TreeSet;

public class A05_TreeSetDemo2 {
    public static void main(String[] args) {
        //1.创建3个学生对象
        Student s1=new Student("zhangsan",23);
        Student s2=new Student("lisi",24);
        Student s3=new Student("wangwu",25);

        //2.创建集合对象
        TreeSet<Student> ts=new TreeSet<>();

        //3.添加元素
        ts.add(s3);
        ts.add(s2);
        ts.add(s1);

        //4.打印集合
        System.out.println(ts);
    }
}

运行结果为:

一开始先添加的25(s3),但一开始没有节点,因此第一次25(s3)自己和自己比较

25(s3)为根节点,因为第一次添加


方式二:比较器排序创建TreeSet对象时,传递比较器Comparator指定规则

(使用原则:默认使用第一种比较方式,如果第一种比较方式不能满足当前需求,就使用第二种比较方式。如字符串里的compareTo方法在idea底层是按照字母顺序进行排序的,如果此时想用别的方式排序,就需要进行大量操作,但太麻烦,因此就需要用第二种排序方式指定比较排序规则;再比如Integer型默认从小到大排,要想从大到小排,最好选第二种排序方式)

Comparator<T>属于函数式接口,可以改用Lambda表达式

例如:

需求:请自行选择比较器排序和自然排序两种方式;

要求:存入四个字符串,"c","ab","df","qwer"

按照长度排序,如果一样长则按照首字母排序

分析:字符串比较方式idea已经写好,虽然可以修改源码来定义自己的排序方式,但太麻烦,因此用比较器排序

package com.itheima.a06mySet;

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

public class A06_TreeSetDemo3 {
    public static void main(String[] args) {
       //1.创建集合
         //o1:表示当前要添加的元素
         //o2:表示已经在红黑树中存在的元素
         //返回值规则:小的存左边,大的存右边,一样的不存
         //先定好规则再添加元素
        TreeSet<String> ts=new TreeSet<>(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                //a.按照长度排序
                int i = o1.length() - o2.length();
                //b.如果一样长则按照首字母排序(即默认排序方式-->o1.compareTo(o2)),不一样长以长度为准即i
                i = i==0?o1.compareTo(o2):i;
                return i;
            }
        });

        //2.添加元素
        ts.add("c");
        ts.add("ab");
        ts.add("df");
        ts.add("qwer");

        //3.打印集合
        System.out.println(ts);//运行结果为[c, ab, df, qwer]
    }
}

注:compare是重写的方法的名字,compareTo是比较字符串用的方法。

改用Lambda表达式:

package com.itheima.a06mySet;

import java.util.TreeSet;

public class A06_TreeSetDemo3 {
    public static void main(String[] args) {
       //1.创建集合
         //o1:表示当前要添加的元素
         //o2:表示已经在红黑树中存在的元素
         //返回值规则:小的存左边,大的存右边,一样的不存
        TreeSet<String> ts=new TreeSet<>((o1,o2) -> {
                //a.按照长度排序
                int i = o1.length() - o2.length();
                //b.如果一样长则按照首字母排序(即默认排序方式-->o1.compareTo(o2)),不一样长以长度为准即i
                i = i==0?o1.compareTo(o2):i;
                return i;
        });

        //2.添加元素
        ts.add("c");
        ts.add("ab");
        ts.add("df");
        ts.add("qwer");

        //3.打印集合
        System.out.println(ts);//运行结果为[c, ab, df, qwer]
    }
}

五.TreeSet对象排序练习题:

题目如下:

解:

Student类:
package a32mySet;

public class Student implements Comparable<Student>{
    //姓名
    private String name;
    //年龄
    private int age;
    //语文成绩
    private int chinese;
    //数学成绩
    private int math;
    //英语成绩
    private int english;


    public Student() {
    }

    public Student(String name, int age, int chinese, int math, int english) {
        this.name = name;
        this.age = age;
        this.chinese = chinese;
        this.math = math;
        this.english = english;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    /**
     * 获取
     * @return chinese
     */
    public int getChinese() {
        return chinese;
    }

    /**
     * 设置
     * @param chinese
     */
    public void setChinese(int chinese) {
        this.chinese = chinese;
    }

    /**
     * 获取
     * @return math
     */
    public int getMath() {
        return math;
    }

    /**
     * 设置
     * @param math
     */
    public void setMath(int math) {
        this.math = math;
    }

    /**
     * 获取
     * @return english
     */
    public int getEnglish() {
        return english;
    }

    /**
     * 设置
     * @param english
     */
    public void setEnglish(int english) {
        this.english = english;
    }

    public String toString() {
        return "Student{name = " + name + ", age = " + age + ", chinese = " + chinese +
                ", math = " + math + ", english = " + english + "}";
    }

    @Override
    public int compareTo(Student o) {
        //求已有的人(this)的总分和要添加的人(o)的总分
        int sum1=this.getChinese()+this.getMath()+this.getEnglish();
        int sum2=o.getChinese()+o.getMath()+o.getEnglish();
        //总分做差
        int i=sum1-sum2;
        //1.先比总分,总分一样,比语文,总分不一样正常来
        i = i==0?this.getChinese()-o.getChinese():i;
        //2.语文一样比数学
        i = i==0?this.getMath()-o.getMath():i;
        //3.数学一样比英语(可省略,因为前面已经证明总分,数学和语文都一样了,那么英语必然一样,且一共就语数英三科)
        i = i==0?this.getEnglish()-o.getEnglish():i;
        //4.英语一样比年龄
        i = i==0?this.getAge()-o.getAge():i;
        //5.年龄一样比姓名
        i = i==0?this.getName().compareTo(o.getName()):i;
         /*当比到姓名时,说明除了姓名外其他属性都一样,如果姓名也一样,则代表属性都一样,且用到了
           方法compareTo,它的底层是红黑树,就不会添加,刚好做到了去重
           (String型属于idea已经写好的,他的compareTo方法可以直接用)
          */
        return i;
    }
}
测试类:
package a32mySet;

import java.util.TreeSet;

public class A07_TreeSetDemo4 {
    public static void main(String[] args) {
        //1.创建学生对象
        Student s1=new Student("zhangsan",23,90,99,50);
        Student s2=new Student("lisi",24,90,98,50);
        Student s3=new Student("wangwu",25,95,100,30);
        Student s4=new Student("zhaoliu",26,60,99,70);
        Student s5=new Student("qianqi",26,70,80,70);

        //2.创建集合
        TreeSet<Student> ts=new TreeSet<>();

        //3.添加元素
        ts.add(s1);
        ts.add(s2);
        ts.add(s3);
        ts.add(s4);
        ts.add(s5);

        //4.打印集合
        for (Student t : ts) {
            System.out.println(t);
        }
    }
}
运行结果:


六.总结:


七.单列集合使用场景:


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

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

相关文章

链表算法题一

​ 旋转链表 旋转链表 首先考虑特殊情况 若给定链表为空表或者单个节点,则直接返回head,不需要旋转操作.题目给定条件范围: 0 < k < 2 ∗ 1 0 9 0 < k < 2 * 10^9 0<k<2∗109,但是受给定链表长度的限制,比如示例2中,k4与k1的效果等价. 那么可以得出kk%l…

QLabel设置图像的方法+绘制文本换行显示

1、QLabel设置图像有两种方法 (1) void setPicture(const QPicture &); (2) void setPixmap(const QPixmap &); QPicture和QPixmap都是继承于QPaintDevice&#xff0c;它们都可以通过加载图片的方式获取&#xff1a;bool load(QIODevice *dev, const char *format …

8.8网络编程

笔记 网络基础 一.网络通信的引入 IPC通信方式&#xff0c;只能完成同一台主机之间多个进程间的通信&#xff0c;在实现跨主机的多个进程间通信时&#xff0c;就显得力不从心了。所以我们引入了网络通信&#xff0c;基于套接字socket的通信方式&#xff0c;能够完成同一主机…

AI Agent工程师认证-学习笔记(2)——【多Agent】AgentScope

基础学习链接&#xff1a;【多Agent】AgentScope学习指南 速通攻略&#xff1a;零基础做个多智能体游戏 Agentscope入门文档&#xff1a;AgentScope 初探 应用开发进阶&#xff1a;AgentScope应用开发入门 AgentScope官方文档&#xff1a;AgentScope官方文档 AgentScope开…

Ghidra:开源软件逆向工程框架

Ghidra 是一个软件逆向工程 (SRE) 框架 Ghidra 是一种尖端的开源软件逆向工程 (SRE) 框架&#xff0c;是美国国家安全局 (NSA) 研究局的产品。 Ghidra 该框架具有高端软件分析工具&#xff0c;使用户能够分析跨各种平台&#xff08;包括 Windows、macOS 和 Linux&#xff09…

【区块链+金融服务】港融区域股权服务平台 | FISCO BCOS应用案例

中国证监会在 2020 年启动了区块链建设试点工作&#xff0c;提出建设基于区块链的场外市场登记系统和交易报告库&#xff0c;利 用区块链去中心化、不易篡改、安全稳定等技术特点&#xff0c;构建区域性股权市场数字化信任机制&#xff0c;为区域性股权市场 提供基础支撑设施。…

【网编】——UDP编程

宏观操作 服务器&#xff1a;socket创套接字—bind绑定连接—recvfrom接收数据/sendto发送数据 客户端&#xff1a;socket创套接字—sendto发送数/recvfrom接收数据—close关闭套接字 函数 recv ssize_t recvfrom ( int sockfd , void * buf , size_t len , int flags , str…

【秋招笔试】8.11大疆秋招(第三套)-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收…

实时推荐算法的架构

1. 实时推荐算法的架构设计 偷得浮生半日闲&#xff0c;跟大家一起聊一聊大家最喜欢的实时推荐算法架构&#xff0c;具体如图1.1&#xff0c;架构的详解则见下一章节《2. 实时推荐算法架构设计详解》。 图 1.1 实时推荐算法的架构设计 2. 实时推荐算法架构设计详解 2.1 数据源…

MySQL 数据类型详解及SQL语言分类-DDL篇

在数据库开发中&#xff0c;选择合适的数据类型和理解SQL语言的分类是非常重要的。今天详细介绍MySQL中的数据类型&#xff0c;包括数值类型、字符串类型和日期类型&#xff0c;并解释SQL语言的四大分类&#xff1a;DDL、DML、DQL和DCL。 1.MySQL 数据类型 SQL语言是不区分大…

C++ 126类和对象_ 运算符重载_仿函数调用

126类和对象_ 运算符重载_仿函数调用 学习内容 仿函数调用 结果 代码 #include<iostream> using namespace std;//cout 在这里&#xff0c;没有它会报错 #include<string>//126类和对象_ 运算符重载_仿函数调用 //学习内容 //仿函数调用class MyPrint { …

【在线+sdwebui】在线免费运行stable-diffusion-webui (无需配置环境)

在线运行平台: https://platform.virtaicloud.com/gemini_web/auth/register 一、进入项目页面启动环境 项目&#xff1a;https://open.virtaicloud.com/web/project/detail/460841914028511232 1.1 点击运行 1.2 克隆环境到注册后的平台 1.3 自动适配项目最低配置的显卡 &…

Java面试题--JVM大厂篇之高并发Java应用的秘密武器:深入剖析GC优化实战案例

引言: 晚上好,Java开发者们!在高并发的现代应用中,垃圾回收器(GC)是Java性能优化的重要环节。尤其在CMS(Concurrent Mark-Sweep)GC曾经担任主角的日子里,适当的调优和优化措施至关重要。本篇文章将通过三个实际案例,探讨如何在不同场景中优化CMS GC,为你揭示Java性能…

前端如何使用Nginx代理dist网页,代理websocket,代理后端

本文将指导您如何配置Nginx以代理前后端分离的项目&#xff0c;并特别说明了对WebSocket的代理设置。通过本教程&#xff0c;您将能够实现一次性配置&#xff0c;进而使项目能够在任意局域网服务器上部署&#xff0c;并可通过IP地址或域名访问服务。 笔者建议 先速览本文了解大…

再见Figma!!新的设计,代码协作神器!【送源码】

软件介绍 Penpot 是一款专门用来帮助设计师和开发者更好地合作的软件。它可以让设计师轻松地做出漂亮的设计稿&#xff0c;还能让这些设计稿变成真正的网站或者应用的一部分。这样&#xff0c;设计师和开发者之间就不会因为沟通不畅而产生麻烦了。 Penpot 专为设计师与开发者之…

Android 下载安装配置

文章目录 Android Studio 下载安装配置1. 下载JDK2. JDK环境配置&#xff1a;3. 测试JDK是否安装成功&#xff1a;4. 下载Android Studio:5. 配置Android Studio:6. android studio提速方法1&#xff08;不行&#xff09;方法2&#xff1a;(很行&#xff09; Android Studio 下…

OpenDDS集中发现服务DCPSInfoRepo联邦机制

OpenDDS在提供DCPSInfoRepo集中发现服务的基础上&#xff0c;又提供了集中发现服务DCPSInfoRepo的联邦功能&#xff0c;实际上就是集群功能。 联邦Federation间的通信主题&#xff0c;用于Federation联邦节点间DDS对象的资源库一致性迁移&#xff0c;包括 1&#xff09;OwnerUp…

力扣热题100_图论_994_腐烂的橘子

文章目录 题目链接解题思路解题代码 题目链接 994. 腐烂的橘子 在给定的 m x n 网格 grid 中&#xff0c;每个单元格可以有以下三个值之一&#xff1a; 值 0 代表空单元格&#xff1b; 值 1 代表新鲜橘子&#xff1b; 值 2 代表腐烂的橘子。 每分钟&#xff0c;腐烂的橘子 周…

数据可视化实用干货分享

在当今的数字化时代&#xff0c;数据已成为企业决策的重要基石。然而&#xff0c;面对海量的数据&#xff0c;如何高效地理解、分析和应用这些数据&#xff0c;成为企业面临的一大挑战。数据可视化作为一种将数据转化为图形或图表的技术&#xff0c;为企业提供了强有力的支持。…

第八季完美童模全球人气总冠军【杜姗珊】至高加冕 见证星芒风采!

7月20-23日&#xff0c;2024第八季完美童模全球总决赛在青岛圆满落幕&#xff0c;在盛大的颁奖典礼上&#xff0c; 全球观众网友通过现场参与和网络直播的方式&#xff0c;共同见证了新一代“模”王诞生&#xff01;在众多优秀的小超模中&#xff0c;来自上海的女孩杜姗珊从本次…