TreeSet集合如何管元素唯一哲学原理

by admin on 2018年12月20日

开篇先来说一下形容就首随笔的初衷。

TreeSet:

    初到来画,通读了来画 UWP App
的代码,发现里面确实来无数较高深的技术点,同时也是发那个问题的,增加性,耦合,性能,功效等等。于是大家决定起首重构这一个产品,做一个全新的
“来作画Pro” 出来,历经三单月的凡,这一个活到底正式上架。
(做只稍广告,在 Windows 应用集团搜索 “来作画Pro”
就可以找到,目前合作社定点为收费用,不过生一个月份试用期,尽管我们感谢兴趣,可以与自身若免费代码。这里是
IT之小之报道:https://www.ithome.com/html/win10/324042.htm)。在落实了旧版
“来打” 所有工具功效的底子及,大家实现了双重多的 Ink 画笔和 Dial
成效,更好之 SVG 解析和制图,更好之文字绘制过程,录像以及 gif
图的插等等。而写就首稿子,以及背后一个层层著作的初衷,就是想遍的追思一下
“来作画Pro” 开发被使用到的技术同遇的题目,希望能分享给重新多对 UWP
和手绘录像发趣味之人。

  1.特点

            TreeSet是用来排序的, 可以指定一个挨家挨户,
对象存入之后会按部就班指定的顺序排列

  2.使办法

     a.自然顺序(Comparable)

           TreeSet类的add()方法被碰面管存入的靶子进步也Comparable类型

          
调用对象的compareTo()方法及汇集中的对象相比(当前存入的是孰,什么人就是会调用compareTo方法)

           依照compareTo()方法再次来到的结果开展仓储

   b.相比较器顺序(Comparator)

          创设TreeSet的上可制定 一个Comparator

          如若传入了Comparator的子类对象,
那么TreeSet就会面仍相比器中之逐条排序

          add()方法中会活动调用Comparator接口中compare()方法排序

         
调用的靶子(就是眼前存入的靶子)是compare方法的首先个参数,集合中的目的(已经添加上的靶子)是compare方法的亚独参数

   c.两栽方法的分别

           TreeSet构造函数什么还无污染,
默认遵照类中Comparable的依次(没有就报错ClassCastException)

           TreeSet如若传入Comparator, 就先遵照Comparator

 哲学原理 1

1. TreeSet囤积Integer类型的因素

package online.msym.set;
import java.util.Comparator;
import java.util.TreeSet;
import online.msym.bean.Person;
public class Demo3_TreeSet {
    /**
     * @param args
     * TreeSet集合是用来对象元素进行排序的,同样他也可以保证元素的唯一    
     */
    public static void main(String[] args) {
        demo1();        
    }
    public static void demo1() {
        TreeSet<Integer> ts = new TreeSet<>();
        ts.add(3);
        ts.add(1);
        ts.add(1);
        ts.add(2);
        ts.add(2);
        ts.add(3);
        ts.add(3);        
        System.out.println("TreeSet存储Integer类型的元素: " + ts);
    }
}

现今言归正传,开端对 “来画Pro”
的依次职能的兑现模式与效果做概括的享用,前边会发一个多元之稿子针对性每个效用点举办详细的辨证。

哲学原理 2

1. Win2D – 手绘录像渲染绘制的基本功

2. TreeSet仓储于定义对象

package online.msym.set;
import java.util.Comparator;
import java.util.TreeSet;
import online.msym.bean.Person;
public class Demo3_TreeSet {
    /**
     * @param args
     * TreeSet集合是用来对象元素进行排序的,同样他也可以保证元素的唯一
     * 当compareTo方法返回0的时候集合中只有一个元素
     * 当compareTo方法返回正数的时候集合会怎么存就怎么取
     * 当compareTo方法返回负数的时候集合会倒序存储
     */
    public static void main(String[] args) {        
        demo2();        
    }
    public static void demo2() {
        //因为TreeSet要对元素进行排序,那你排序的依据是什么,姓名还是年龄还是其它的,得告诉它,怎么告诉?
        //需要让Person类实现Comparable接口重写compareTo方法
        TreeSet<Person> ts = new TreeSet<>();
        ts.add(new Person("张三", 23));
        ts.add(new Person("李四", 13));
        ts.add(new Person("周七", 13));
        ts.add(new Person("王五", 43));
        ts.add(new Person("赵六", 33));

        System.out.println(ts);
    }

}

哲学原理 3

在意点的出口,跟添加的顺序相反,这是以compareTo方法的再次来到值

Person实体类:

package online.msym.bean;
//为了简化代码,这里没有hashCode和equals方法,用的话可以直接将上面的Person类中的hashCode和equals复制过来
public class Person implements Comparable<Person> {
    private String name;
    private int age;
    public Person() {
        super();

    }
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]\n";
    }        
    public int compareTo(Person o) {
        //return 0;
        //return 1;
        return -1
    }

}

     Win2D 是依据 Windows Runtime 的 2D 图形 GPU 渲染 SDK,可以就此当 UWP
、Windows Phone 和  Windows Runtime App 备受, 编程语言可以是 C++、C# 或
VB,相信于 UWP 中尝试了图形渲染绘制的同校等,对 Win2D
都非会师生,毕竟自己自己软推荐的贯彻格局。 GitHub
地址:https://github.com/Microsoft/Win2D,微软官网地址:http://microsoft.github.io/Win2D/html/Introduction.htm,基础的施用办法还好以其间找到,此外官还提供了一个怪正确的
Sample 供我们参考,在 Windows Store
也得以下载:https://www.microsoft.com/zh-cn/store/p/win2d-example-gallery/9nblgggxwt9f?rtc=1,下面是
Sample 截图:

TreeSet保证元素唯一和本排序的法则和图解

 

TreeSet保证元素唯一和自排序的规律及图解,小之拓宽左边,大的放大左侧

哲学原理 4

哲学原理 5

 

遵照Person类的岁排序的语句,Person类改写为:

//注意使用此类时要生成空参有参构造,set和get方法,hashCode和equals方法
package online.msym.bean;
public class Person implements Comparable<Person> {
    private String name;
    private int age;    
    @Override
    //按照年龄排序
    public int compareTo(Person o) {
       int num = this.age - o.age; //按照年龄比较 

return num;

     //return num == 0 ? this.name.compareTo(o.name) : num;//姓名是比较的次要条件
    }    
}

TreeSet保证元素唯一和相比器排序的法则:

概念相比较器是促成Comparator接口,重写compare方法和equals方法,可是由拥有的类默认继承Object,而Object中发出equals方法,

就此于定义相比器类时,不用再行写equals方法,只待再行写compare方法

字符串长度比器图解:

哲学原理 6

style=”color: #ff0000″>下边用了少数种艺术:匿名的里类的相比较器对象,自定义之相比较器对象,

package online.msym.test;
import java.util.Comparator;
import java.util.TreeSet;
import online.msym.bean.Person;
public class Demo3_TreeSet {
    public static void main(String[] args) {
        //demo1();
        demo2();
    }
    private static void demo2() {
        // 需求:将字符串按照长度排序, (利用匿名内部类对象, 长度从大到小, 长度相同按照字母倒序)
        TreeSet<String> ts = new TreeSet<>(new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                int num = s2.length() - s1.length(); // 长度为主要条件
                return num == 0 ? s2.compareTo(s1) : num; // 内容为次要条件
            }
        }); 
        ts.add("aaaaaaaa");
        ts.add("z");
        ts.add("wc");
        ts.add("nba");
        ts.add("cba");
        System.out.println(ts);
    }
    private static void demo1() {
        // 需求:将字符串按照长度排序,(传递一个自定义的比较器对象)
        TreeSet<String> ts = new TreeSet<>(new CompareByLen()); // Comparator c = new CompareByLen();
        ts.add("aaaaaaaa");
        ts.add("z");
        ts.add("wc");
        ts.add("nba");
        ts.add("cba");
        System.out.println(ts);
    }
}
class CompareByLen /* extends Object */implements Comparator<String> {//实现一个比较器类
    @Override
    public int compare(String s1, String s2) { // 按照字符串的长度比较
        int num = s1.length() - s2.length(); // 长度为主要条件
        return num == 0 ? s1.compareTo(s2) : num; // 内容为次要条件
    }
}

【点击这里回到主页】

哲学原理 7

2. SVG 的剖析和制图

    如大家所精通之,SVG 是同种矢量图格式,不同于位图的凡,它的组成是一个
XML,节点新闻包括了 path,stroke,fill 等,分别表示了 SVG
的不二法门,路径边框以及填充规则。我们针对 SVG 的操作,先是 SVG
的解析及静态体现,再是因 SVG
原有的路组成及顺序,结合手绘习惯的顺序,路径的毕竟长度以及制图总时长,在各级一样幅里决定展示哪部分路线,或填充啊有形。来拘禁一下用到被的贯彻力量,下面三布置图呈现的凡一个
SVG 的绘图过程:

哲学原理 8 哲学原理 9 哲学原理 10

3. PNG/JPEG/BMP 等位图的绘图

    PNG/JPEG/BMP
等图片格式,有着不同的滑坡和编码格式,但以都属于位图,所以做要素仍然像素,由一个
width * height 的长的数组来囤积每个像素点的例如素值,像素值的结缘可能是
ARGB/BGR/YUV 等多格式。因为位图是未曾途径的,默认大家没道像 SVG
这样绘制有其的做进程,
所以我们捎了扳平栽相持简单的渲染绘制方法:从图片的一个角绘制到另外一个比,比如左上角及右下角,保持安澜之进度以及可行性,这样虽由于了下图的绘图过程。

    当然者才是绝简单易行粗暴的拍卖方法,实际情况被,很多之 SVG
中无特含有路径,也会见蕴藏位图。例如当 PS 里处理好同一摆设图片,然后导入到 AI
中,手动划有一些门道,最终导出 SVG。这样的 SVG 正确的绘图过程,应该是因
AI 中路径,结合各图备受针对承诺地点的
Stroke,来绘制出来。大家于针对位图的拍卖着,也堪在被用户失去形容路径的方法,丰裕展现格局。或者对各图做活动边缘勾勒,抠图操作等等,后边会开展详细分享。

哲学原理 11 哲学原理 12

4. 仿的辨析及制图

   
文字,是手绘视频里死要紧之变现和表明情势,也是分析和制图过程被相对复杂的一个。在确定一栽字体后,我们会晤当对应之字
TTF
文件中取出相应的仿来展现,也堪用到代表文字有所边缘之途径数据。不过手绘视频被显示的主意,是摹写字体的填写,而不是边缘;此外字体自身的边缘,是没有其它顺序和法则的,只是简短的重组字体的边缘,所以我们得对边缘路径做以下处理:

    取得边缘路径数据 ->
对路线中之触发,逐点做横向或纵向的射线,记录有相交的点集合 ->
边缘路径点集和交点集统计出中间点集 ->
对中间点集做健康文字的上到下/左到右手的排序 -> 依据点距离做还分组
-> 按照拍卖后底点集完成路径绘制。

哲学原理 13 哲学原理 14 哲学原理 15

5. Ink 的绘图和 Surface Pen、Surface Dial 的施用

    Ink 笔迹,在 Windows 10
中起大丰硕的下场景,如绘画图类,书写类,手绘摄像类的使用。微软的 Windows
SDK 里提供了要命棒的 InkToolbar 和
InkCanvas,可以默认辅助三种植画笔的展现,如圆珠笔、钢笔、铅笔、荧光笔等。而我们在手绘视频被需进行的,就是将
SDK
默认援助的静态显示,增添为动态绘制的支撑,以及导出视频被的扶助。像圆珠笔这种规则之笔尖,我们得以一贯将
Ink
数据取出使用;而铅笔的墨粉效果、钢笔的思路方向粗细和荧光笔的混色效果,则需要协调开单独的处理了。前面会指向各一样种植画笔的拍卖做详细的讲课,这里小勿举办了。

    InkToolbar 和 InkCanvas 默认辅助 Surface Dial 和 Surface Pen
的操作。而我辈的用里对 Surface Dial
也开了重复多扩充的支撑,如选用颜色、拔取画笔等。下边是 InkToolbar 和
InkCanvas 的一模一样摆示意图和下被使 Surface Dial 的操作图(来自
IT之小之报导):

哲学原理 16哲学原理, 哲学原理 17

6. 手绘视频中插入视频文件

   
手绘视频中插入录像,能够给表现模式变得更长。常见的景,在摄像旁插足手绘人物素材,变成人在演说和对白;或于视频中在贴纸或道具等,可以当视频旁或视频被动态变化,这样于就的处理视频在贴纸更增长,电视机节目中时会望;再要以手绘中插入录像,变成一个动态的背景等等。下边时中同样栽情景:

    对于大家以次中的拍卖,在操作与预览时,更多之日常直运用了系统的
MediaElementPlayer
播放器。而以导出视频时,需要对插入视频的轴做单独处理,还有针对视频的音轨做处理。

哲学原理 18 哲学原理 19

7. 录像的变化和导出

    在方的最首要操作就后,我们得把它导出成一个录像文件,如
MP4、WMV。而此变化过程要概括了点滴单有:① 是用 Win2D
做后台的渲染操作,还原真实的渲染过程与速,按照指定的帧率把各一样幅位图保存下来;②
是利用类似 FFMpeg
的方法,把帧体系遵照指定帧率保存也视频,同时处理叠加背景音乐和插视频的音轨,完成视频文件生成。

 

   
到者截止,就完成了手绘视频的要要素解析、渲染、操作和视频导出的为主流程。前天的章先概括的介绍一下每个有的落实原理,后边会陆续对各一个部分做详细的讲授,尤其是
SVG 和
文字绘制方面,详细的原理与落实,以及支付进程被遭受的各样题材,或协调的,或微软系统的。以及各个画笔的贯彻格局。

敬请期待,谢谢!

 

以下边每首详细讲解的地址,持续改进:

UWP 手绘录像创作工具技术分享体系 – SVG
的辨析及制图 http://www.cnblogs.com/shaomeng/p/7476480.html 

UWP 手绘录像创作工具技术分享系列 – 文字的分析和制图
http://www.cnblogs.com/shaomeng/p/7537979.html

UWP 手绘录像创作工具技术分享系列 – 手绘视频与视频的结缘
http://www.cnblogs.com/shaomeng/p/7594286.html

UWP 手绘录像创作工具技术分享系列 – Ink & Surface
Dial http://www.cnblogs.com/shaomeng/p/7634148.html

UWP 手绘视频创作工具技术分享体系 –
位图的绘图 http://www.cnblogs.com/shaomeng/p/7668523.html

UWP 手绘录像创作工具技术分享连串 –
手绘录像导出 http://www.cnblogs.com/shaomeng/p/7680210.html

UWP 手绘视频创作工具技术分享序列 – 有 AI
的手绘录像 https://www.cnblogs.com/shaomeng/p/8228491.html

UWP 手绘视频创作工具技术分享体系 – 全新的 UWP
来画视频 http://www.cnblogs.com/shaomeng/p/8228944.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图