javase复习day22泛型、set、数据结构

泛型

package MyGenerics;import java.util.ArrayList;
import java.util.Iterator;public class GenericsTest1 {public static void main(String[] args) {//没有泛型的情况ArrayList list = new ArrayList();//所有数据都被认为是Object类型,都可以加入集合中list.add(123);list.add("string");list.add('a');Iterator it = list.iterator();while (it.hasNext()){//遍历取出的也是Object类型,由于多态的性质,所以子类中特有的方法无法使用。造成不便Object next = it.next();System.out.println(next);}}
}

 泛型的细节

泛型的应用范围

泛型类

package MyGenerics;import java.util.Arrays;/*
这是我写的第一个泛型类*/
public class Myarraylist<E> {Object[] obj;int size;public Myarraylist() {//定义一个Object数组obj = new Object[10];size = 0;}//添加数据public  boolean add(E e){obj[size] = e;size++;return true;}//取出数据public E get(int n){return (E)obj[n];}//toString方法@Overridepublic String toString() {return Arrays.toString(obj);}
}
package MyGenerics;public class GenericsTest2 {public static void main(String[] args) {
//        Myarraylist<String> myarraylist = new Myarraylist<>();
//        myarraylist.add("wwwe");
//        myarraylist.add("qqq");
//        myarraylist.add("aaa");
//
//        System.out.println(myarraylist.get(1));
//
//        System.out.println(myarraylist);Myarraylist<Integer> myarraylist = new Myarraylist<>();myarraylist.add(111);myarraylist.add(222);myarraylist.add(333);System.out.println(myarraylist.get(1));System.out.println(myarraylist);}
}

泛型方法

练习一:泛型方法的练习

package MyGenerics;import java.util.ArrayList;public class ListUtil {//工具类,私有化无参构造private ListUtil() {}//传入一个要添加的集合,和多个数据/*<E> 泛型方法中要放在修饰符后面*/public static<E> boolean addAll(ArrayList<E> arrayList,E e1,E e2,E e3,E e4){arrayList.add(e1);arrayList.add(e2);arrayList.add(e3);arrayList.add(e4);return true;}//可以传入多个要添加的数据\/*E...e 为可变参数可以传入一个或者多个变量,可变参数必须在形参列表的最后面*/public static<E> boolean addAll2(ArrayList<E> arrayList,E...e){for (E element : e) {arrayList.add(element);}return true;}}
package MyGenerics;import java.util.ArrayList;public class GenericsTest3 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();ListUtil.addAll(list,"qqq","aaa","zzz","www");System.out.println(list);//使用可变参数ArrayList<String> list2 = new ArrayList<>();ListUtil.addAll2(list2,"qqq","aaa","zzz","www","sss");ListUtil.addAll2(list2,"eee","ddd","ccc");System.out.println(list2);}
}

泛型接口

//实现List接口并指定泛型类,可以使用的类型确认
public class Myarraylist2 implements List<String> {@Overridepublic int size() {return 0;}@Overridepublic boolean isEmpty() {return false;}@Overridepublic boolean contains(Object o) {return false;}}
}
package MyGenerics;import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;//实现List接口不指定泛型类,延续接口的泛型,在调用类时在确定
//即方法二
public class Myarraylist3<E> implements List<E> {@Overridepublic int size() {return 0;}@Overridepublic boolean isEmpty() {return false;}@Overridepublic boolean contains(Object o) {return false;}@Overridepublic Iterator<E> iterator() {return null;}@Overridepublic Object[] toArray() {return new Object[0];}@Overridepublic <T> T[] toArray(T[] a) {return null;}@Overridepublic boolean add(E e) {return false;}@Overridepublic boolean remove(Object o) {return false;}@Overridepublic boolean containsAll(Collection<?> c) {return false;}@Overridepublic boolean addAll(Collection<? extends E> c) {return false;}@Overridepublic boolean addAll(int index, Collection<? extends E> c) {return false;}@Overridepublic boolean removeAll(Collection<?> c) {return false;}@Overridepublic boolean retainAll(Collection<?> c) {return false;}@Overridepublic void clear() {}@Overridepublic E get(int index) {return null;}@Overridepublic E set(int index, E element) {return null;}@Overridepublic void add(int index, E element) {}@Overridepublic E remove(int index) {return null;}@Overridepublic int indexOf(Object o) {return 0;}@Overridepublic int lastIndexOf(Object o) {return 0;}@Overridepublic ListIterator<E> listIterator() {return null;}@Overridepublic ListIterator<E> listIterator(int index) {return null;}@Overridepublic List<E> subList(int fromIndex, int toIndex) {return null;}
}

泛型的继承和统配符

泛型不具备继承性但数据具备继承性。

     * 此时,泛型里面写的是什么类型,那么只能传递什么类型的数据。

     * 弊端:

     *      利用泛型方法有一个小弊端,此时他可以接受任意的数据类型

     *      Ye  Fu   Zi    Student

     *

     * 希望:本方法虽然不确定类型,但是以后我希望只能传递Ye Fu Zi

     *

     * 此时我们就可以使用泛型的通配符:

     *      ?也表示不确定的类型

     *      他可以进行类型的限定

     *      ? extends E: 表示可以传递E或者E所有的子类类型

     *      ? super E:表示可以传递E或者E所有的父类类型

     *

     * 应用场景:

     *      1.如果我们在定义类、方法、接口的时候,如果类型不确定,就可以定义泛型类、泛型方法、泛型接口。

     *      2.如果类型不确定,但是能知道以后只能传递某个继承体系中的,就可以泛型的通配符

     * 泛型的通配符:

     *      关键点:可以限定类型的范围。

package com.itheima.a04mygenerics;import java.util.ArrayList;public class GenericsDemo5 {public static void main(String[] args) {/*泛型不具备继承性,但是数据具备继承性*///创建集合的对象ArrayList<Ye> list1 = new ArrayList<>();ArrayList<Fu> list2 = new ArrayList<>();ArrayList<Zi> list3 = new ArrayList<>();//调用method方法//method(list1);//method(list2);//method(list3);list1.add(new Ye());list1.add(new Fu());list1.add(new Zi());}/** 此时,泛型里面写的是什么类型,那么只能传递什么类型的数据。* */public static void method(ArrayList<Ye> list) {}}
package com.itheima.a04mygenerics;import java.util.ArrayList;public class GenericsDemo6 {public static void main(String[] args) {/**   需求:*       定义一个方法,形参是一个集合,但是集合中的数据类型不确定。** *///创建集合的对象ArrayList<Ye> list1 = new ArrayList<>();ArrayList<Fu> list2 = new ArrayList<>();ArrayList<Zi> list3 = new ArrayList<>();ArrayList<Student2> list4 = new ArrayList<>();method(list1);method(list2);//method(list3);//method(list4);}/** 此时,泛型里面写的是什么类型,那么只能传递什么类型的数据。* 弊端:*      利用泛型方法有一个小弊端,此时他可以接受任意的数据类型*      Ye  Fu   Zi    Student** 希望:本方法虽然不确定类型,但是以后我希望只能传递Ye Fu Zi** 此时我们就可以使用泛型的通配符:*      ?也表示不确定的类型*      他可以进行类型的限定*      ? extends E: 表示可以传递E或者E所有的子类类型*      ? super E:表示可以传递E或者E所有的父类类型** 应用场景:*      1.如果我们在定义类、方法、接口的时候,如果类型不确定,就可以定义泛型类、泛型方法、泛型接口。*      2.如果类型不确定,但是能知道以后只能传递某个继承体系中的,就可以泛型的通配符* 泛型的通配符:*      关键点:可以限定类型的范围。** */public static void method(ArrayList<? super Fu> list) {}
}class Ye {
}class Fu extends Ye {
}class Zi extends Fu {
}class Student2{}

练习一:

package Test1;public abstract class Animal {private String name;private int age;public Animal() {}public Animal(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 abstract void eat();public String toString() {return "Animal{name = " + name + ", age = " + age + "}";}
}
package Test1;public abstract class Cat extends Animal{//1.继承抽象类,重写里面所有的抽象方法//2.本身Cat也是一个抽象的,让Cat的子类再重写重写方法//此时采取第二种处理方案//因为猫的两个子类中eat的方法体还是不一样的。}
package Test1;public abstract class Dog extends Animal{
}
package Test1;public class HuskyDog extends Dog {@Overridepublic void eat() {System.out.println("一只叫做" + getName() + "的," + getAge() + "岁的哈士奇,正在吃骨头,边吃边拆家");}
}
package Test1;public class LiHuaCat extends Cat {@Overridepublic void eat() {System.out.println("一只叫做" + getName() + "的," + getAge() + "岁的狸花猫,正在吃鱼");}
}
package Test1;public class PersianCat extends Cat {@Overridepublic void eat() {System.out.println("一只叫做" + getName() + "的," + getAge() + "岁的波斯猫,正在吃小饼干");}
}
package Test1;public class TeddyDog extends Dog{@Overridepublic void eat() {System.out.println("一只叫做"+getName()+"的,"+getAge()+"岁的泰迪,正在吃骨头,边吃边蹭");}
}
package com.itheima.a05test;import java.util.ArrayList;public class Test1 {public static void main(String[] args) {/*需求:定义一个继承结构:动物|                           |猫                          狗|      |                    |      |波斯猫   狸花猫                泰迪   哈士奇属性:名字,年龄行为:吃东西波斯猫方法体打印:一只叫做XXX的,X岁的波斯猫,正在吃小饼干狸花猫方法体打印:一只叫做XXX的,X岁的狸花猫,正在吃鱼泰迪方法体打印:一只叫做XXX的,X岁的泰迪,正在吃骨头,边吃边蹭哈士奇方法体打印:一只叫做XXX的,X岁的哈士奇,正在吃骨头,边吃边拆家测试类中定义一个方法用于饲养动物public static void keepPet(ArrayList<???> list){//遍历集合,调用动物的eat方法}要求1:该方法能养所有品种的猫,但是不能养狗要求2:该方法能养所有品种的狗,但是不能养猫要求3:该方法能养所有的动物,但是不能传递其他类型*/ArrayList<PersianCat> list1 = new ArrayList<>();ArrayList<LiHuaCat> list2 = new ArrayList<>();ArrayList<TeddyDog> list3 = new ArrayList<>();ArrayList<HuskyDog> list4 = new ArrayList<>();keepPet(list1);keepPet(list2);keepPet(list3);keepPet(list4);}//该方法能养所有的动物,但是不能传递其他类型public static void keepPet(ArrayList<? extends Animal> list){//遍历集合,调用动物的eat方法}/*  //  要求2:该方法能养所有品种的狗,但是不能养猫public static void keepPet(ArrayList<? extends Dog> list){//遍历集合,调用动物的eat方法}*//*//要求1:该方法能养所有品种的猫,但是不能养狗public static void keepPet(ArrayList<? extends Cat> list){//遍历集合,调用动物的eat方法}*/
}

泛型总结

数据结构(树)

二叉查找树

二叉查找树添加节点规则:

        小的存左边,大的存右边,一样的不存。

二叉树的遍历

前序遍历

中序遍历

后序遍历

层序遍历

遍历方式小结

二叉树小结

二叉查找树的弊端

如果数据插入的顺序与数据的大小顺序一致则会退化为链表,查询速度下降。

平衡二叉树

规则:任意节点左右字数高度差不超过1.

树的演变

保证二叉树平衡的机制

左旋和右旋。

左旋

旋转之后

右旋

旋转之后

需要旋转的四种情况

左左:根节点左子树的左子树上发生不平衡。

左右:根节点左子树的右子树上发生不平衡。

右右:根节点右子树的右子树上发生不平衡。

右左:根节点右子树的左子树上发生不平衡。

红黑树

红黑规则

添加节点的规则

红黑树增删改查性能都很好。

Set系列集合

无序、不重复、无索引。

无序:存和取的顺序不同。

不重复:可以去重。

无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引获取元素。

实现类:

HashSet:无序、不重复、无索引

LinkHashSet:有序、不重复、无索引

TreeSet:可排序、不重复、无索引

Set中的方法基本和Collection的API一致

练习一:存储字符串并遍历

package MySetDemo;import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;public class Test1 {public static void main(String[] args) {Set<String> set = new HashSet<>();set.add("aaa");set.add("bbb");set.add("ccc");set.add("ddd");set.add("eee");boolean b = set.add("eee");//不重复System.out.println(b);//false//无序System.out.println(set);//遍历//迭代器Iterator<String> it = set.iterator();while (it.hasNext()){String str = it.next();System.out.println(str);}System.out.println("==============================");//增强forfor (String s : set) {System.out.println(s);}System.out.println("==============================");//Lambda表达式set.forEach(s-> System.out.println(s));}
}

HashSet

底层原理

哈希值:

package MySetDemo;public class hashtest {public static void main(String[] args) {//创建两个对象Student s1 = new Student("zhansan",21);Student s2 = new Student("zhansan",21);//未重写之前不同对象的哈希值是不同的
//        System.out.println(s1.hashCode());//990368553
//        System.out.println(s2.hashCode());//1096979270//重写hashcode,由于属性相同所以哈希值也相同System.out.println(s1.hashCode());//-1432263087System.out.println(s2.hashCode());//-1432263087//哈希碰撞String st1 = "abc";String st2 = "acD";System.out.println(st1.hashCode());//96354System.out.println(st2.hashCode());//96354}
}

底层原理

总结:

1.由数组、链表、红黑树组成

2.查询对象的哈希值根据哈希值判断存储数组的位置,如果数组位置为空则直接存入,如果位置不为空则链表链接在该对象下面。

3.存储为数组链表红黑树结合无法确定顺序。

4.与三的原因相同

5哈希值和equse方法结合进行。

案例一:利用hashSet去重

package MySetDemo;import java.util.HashSet;public class hashtestDemo2 {public static void main(String[] args) {//创建两个对象Student s1 = new Student("zhansan",21);Student s2 = new Student("wanger",21);Student s3 = new Student("lisi",21);Student s4 = new Student("wangwu",21);Student s5 = new Student("zhaoliu",21);Student s6 = new Student("zhansan",21);//创建HashSet对象利用其不重复的特性进行去重HashSet<Student> hashSet = new HashSet<>();System.out.println(hashSet.add(s1));System.out.println(hashSet.add(s2));System.out.println(hashSet.add(s3));System.out.println(hashSet.add(s4));System.out.println(hashSet.add(s5));System.out.println(hashSet.add(s6));for (Student student : hashSet) {System.out.println(student);}}
}

LinkedHashSet

package MySetDemo;import java.util.HashSet;
import java.util.LinkedHashSet;public class LinkHashsetdemo {public static void main(String[] args) {//创建对象Student s1 = new Student("zhansan", 21);Student s2 = new Student("wanger", 21);Student s3 = new Student("lisi", 21);Student s4 = new Student("wangwu", 21);Student s5 = new Student("zhaoliu", 21);Student s6 = new Student("zhansan", 21);//LinkedHashSetLinkedHashSet<Student> hashSet = new LinkedHashSet<>();System.out.println(hashSet.add(s1));System.out.println(hashSet.add(s2));System.out.println(hashSet.add(s3));System.out.println(hashSet.add(s4));System.out.println(hashSet.add(s5));System.out.println(hashSet.add(s6));System.out.println(hashSet);}
}

LinkedHashSet小结

TreeSet

特点

练习一:TreeSet对象排序练习题

import java.util.Iterator;
import java.util.TreeSet;
import java.util.function.Consumer;public class MyTreeSetdemo {public static void main(String[] args) {//创建TreeSet对象TreeSet<Integer> ts = new TreeSet<>();//添加元素ts.add(5);ts.add(2);ts.add(4);ts.add(3);ts.add(1);//输出System.out.println(ts);//[1, 2, 3, 4, 5]System.out.println("---------------------------------");//进行遍历//迭代器遍历Iterator<Integer> it = ts.iterator();while (it.hasNext()){Integer next = it.next();System.out.println(next);}System.out.println("=================================");//增强forfor (Integer t : ts) {System.out.println(t);}System.out.println("--------------------------------------");//lambda表达式
//        ts.forEach(new Consumer<Integer>() {
//            @Override
//            public void accept(Integer integer) {
//                System.out.println(integer);
//            }
//        });ts.forEach( integer-> System.out.println(integer));}
}

TreeSet集合的默认的规则

练习一:TreeSet对象排序练习题

Student类需要实现 接口并重写方法,才可以存入TreeSet中。

package MySetDemo.TreeSetDemo1;import java.util.TreeSet;public class TreeSetDemo1 {public static void main(String[] args) {//创建Stuent对象Student s1 = new Student("xiaozhao",22);Student s2 = new Student("wangwu",23);Student s3 = new Student("zhangsan",24);//创建一个TreeSet对象TreeSet<Student> ts = new TreeSet<>();//添加数据ts.add(s1);ts.add(s3);ts.add(s2);System.out.println(ts);}
}
package MySetDemo.TreeSetDemo1;public class Student implements Comparable<Student>{private String name;private int age;@Overridepublic int compareTo(Student o) {//实现此方法才可以添加进TreeSet中/*实现implements Comparable<Student>接口返回 负数 红黑数认为这个对象比已经在树上的小整数 认为大0   认为已经存在*/return this.age-o.getAge();}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 + "}";}}

TreeSet的两种比较方式

练习二:TreeSet对象排序练习题

package MySetDemo.TreeSetDemo2;import java.util.Comparator;
import java.util.TreeSet;public class TreeSetDemo2 {public static void main(String[] args) {//由于排序规则与源码定义的不同则使用比较器排序TreeSet<String> ts = new TreeSet<>(new Comparator<String>() {/*o1 :为要加入的元素o2 :为已经加入的元素规则与第一种相同*/@Overridepublic int compare(String o1, String o2) {//先判断长度int i = o1.length() - o2.length();//如长度相同则调用原本的判定规则即被String重写的compareTo方法i = i == 0?o1.compareTo(o2):i;return i;}});//添加元素ts.add("ab");ts.add("c");ts.add("df");ts.add("qwer");System.out.println(ts);}
}

练习三:TreeSet对象排序练习题

package MySetDemo.TreeSetdemo3;import java.util.TreeSet;public class TreeSetDemo3 {public static void main(String[] args) {Student s1 = new Student("xiaoli",20,80,80,80);Student s2 = new Student("laozhao",21,80,88,80);Student s3 = new Student("zhangsan",20,85,85,85);Student s4 = new Student("lisi",23,87,80,80);Student s5 = new Student("xiaoli",20,80,80,80);TreeSet<Student> st = new TreeSet<>();st.add(s1);st.add(s2);st.add(s3);st.add(s4);st.add(s5);System.out.println(st);}
}
package MySetDemo.TreeSetdemo3;public class Student implements Comparable<Student>{private String name;private int age;private int Chinese;private int Math_scores;private int Englich_scores;//总分private int sum;//将无参构造私有化,创建对象必须赋值private Student() {}public Student(String name, int age, int Chinese, int Math_scores, int Englich_scores) {this.name = name;this.age = age;this.Chinese = Chinese;this.Math_scores = Math_scores;this.Englich_scores = Englich_scores;sum = Chinese+Math_scores+Englich_scores;System.out.println(sum);}@Overridepublic int compareTo(Student o) {//实现此方法才可以添加进TreeSet中/*实现implements Comparable<Student>接口返回 负数 红黑数认为这个对象比已经在树上的小整数 认为大0   认为已经存在*/int i =  o.sum - this.sum ;//判断i的值//总分相同则判断语文分数,并赋值给ii = i == 0 ? o.Chinese -this.Chinese : i;//语文分数是否相同,判断数学i = i == 0 ? o.Math_scores-this.Math_scores : i;i = i == 0 ? o.Englich_scores -this.Englich_scores : i;i = i == 0 ?  o.age -this.age : i;//判断字母所以调用String中重写的compareTo方法i =  i == 0?this.name.compareTo(o.name):i;return i;}/*** 获取* @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_scores*/public int getMath_scores() {return Math_scores;}/*** 设置* @param Math_scores*/public void setMath_scores(int Math_scores) {this.Math_scores = Math_scores;}/*** 获取* @return Englich_scores*/public int getEnglich_scores() {return Englich_scores;}/*** 设置* @param Englich_scores*/public void setEnglich_scores(int Englich_scores) {this.Englich_scores = Englich_scores;}public String toString() {return "Student{name = " + name + ", age = " + age + ", Chinese = " + Chinese + ", Math_scores = " + Math_scores + ", Englich_scores = " + Englich_scores+","+sum +"}";}
}

TreeSet小结

单列集合的使用场景

HashSet、LinkedHashSet、TreeSet的源码都是各自的Map。

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

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

相关文章

记录开发一个英语听力训练网站

背景 在当前全球经济衰退的背景下&#xff0c;IT相关的工作在国内的竞争也是越来越激烈&#xff0c;为了能够获得更多的可能性&#xff0c;英语的学习也许能为程序员打开一扇新的窗户&#xff0c;比如很多远程的工作尤其是国际化背景的工作团队&#xff0c;英语的协作沟通是必…

uniapp 发布苹果IOS详细流程,包括苹果开发者公司账号申请、IOS证书、.p12证书文件等

记录一下uniapp发布苹果IOS的流程。 一、苹果开发者公司账号申请 1、邓白氏编码申请&#xff08;先申请公司邓白氏编码&#xff0c;这一步需要1-2周&#xff0c;没有这个编码苹果开发者没法申请&#xff0c;已有编码的跳过此步骤&#xff09;&#xff1a; 1&#xff09;联系苹…

[机器学习]决策树

1 决策树简介 2 信息熵 3 ID3决策树 3.1 决策树构建流程 3.2 决策树案例 4 C4.5决策树 5 CART决策树&#xff08;分类&回归&#xff09; 6 泰坦尼克号生存预测案例 import pandas as pd from sklearn.model_selection import train_test_split from sklearn.tree import …

链表的快速排序(C/C++实现)

一、前言 大家在做需要排名的项目的时候&#xff0c;需要把各种数据从高到低排序。如果用的快速排序的话&#xff0c;处理数组是十分简单的。因为数组的存储空间的连续的&#xff0c;可以通过下标就可以简单的实现。但如果是链表的话&#xff0c;内存地址是随机分配的&#xf…

【H2O2|全栈】关于CSS(2)CSS基础(二)

目录 CSS基础知识 前言 准备工作 选择器的组合 盒模型 示例网页代码 后代选择器 亲代选择器 相邻兄弟选择器 后续兄弟选择器 多个元素选择器 通配符选择器 优先级 其他应用 伪类 锚链接的属性 列表的属性 list-style-type list-style-position list-style…

react 事件处理

概述 Web应用中&#xff0c;事件处理是重要的一环&#xff0c;事件处理将用户的操作行为转换为相应的逻辑执行或界面更新。在React中&#xff0c;处理事件响应的方式有多种&#xff0c;本文将详细介绍每一种处理方式的用法、使用场景和优缺点。 如果原生DOM有一个监听事件&…

QGis二次开发 —— 3、程序加载栅格tif与矢量shp文件可进行切换控制,可进行导出/导入工程(附源码)

效果 功能说明 软件可同时加载.tif栅格图片与.shp矢量图片、加载图片后可进行自由切换查看图层、可对加载的图片进行关闭 关闭后清空图层、可对加载的图片进行导出.qgs的QGIS工程、可对.qgs的QGis工程导入并导入后可进行自由切换查看图层。 源码 注意: 在加载tif栅格文件后会在…

el-table 如何实现行列转置?

在某些需求里需要用到 行列转置 的表格&#xff0c;但 el-table 提供的基本表格是不支持行列转置的&#xff0c;这样就需要对这个表格进行二次开发。下面来看具体实现的效果&#xff1a; 具体实现方式 基本原理就是对原有的可渲染的数据结构进行处理&#xff0c;表头与表格数…

计算机的错误计算(九十三)

摘要 探讨 log(y,x) 即以 x 为底 y 的对数的计算精度问题。 Log(y,x)运算是指 x 为底 y 的对数。 例1. 计算 log(123667.888, 0.999999999999999) . 不妨在Python中计算&#xff0c;则有&#xff1a; 若在 Excel 单元格中计算&#xff0c;则有几乎同样的输出&#xff1a; 然…

模型部署基础

神经网络的模型部署是将训练好的神经网络模型应用到实际系统中&#xff0c;以实现预测、分类、推荐等任务的过程。下图展示了模型从训练到部署的整个流程&#xff1a; 1.模型部署的平台 在线服务器端部署 在线服务器端部署适用于处理大模型、需要精度优先的应用场景&#xff…

CSCC2024数据库内核赛道Profile记录

同学参加CSCC2024数据库系统赛道比赛&#xff0c;我和他一起研究了一些优化的case&#xff0c;最后成功拿到全国2/325。在这里记录一下我们讨论优化过的问题&#xff08;建议把源码下下来边读边搜代码&#xff0c;否则会晕&#xff09; 行锁占用内存过大 Q&#xff1a;TPCC测…

OpenCV运动分析和目标跟踪(1)累积操作函数accumulate()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将一个图像添加到累积图像中。 该函数将 src 或其部分元素添加到 dst 中&#xff1a; dst ( x , y ) ← dst ( x , y ) src ( x , y ) if mask…

网络基础,协议,OSI分层,TCP/IP模型

网络的产生是数据交流的必然趋势&#xff0c;计算机之间的独立的个体&#xff0c;想要进行数据交互&#xff0c;一开始是使用磁盘进行数据拷贝&#xff0c;可是这样的数据拷贝效率很低&#xff0c;于是网络交互便出现了&#xff1b; 1.网络是什么 网络&#xff0c;顾名思义是…

串口接收不到数据之电阻虚焊bug分析思路

单片机和EC移远通信模块进行通信&#xff0c;相同的代码运行在相同的硬件上&#xff0c;但是一个能联网&#xff0c;一个因为没有EC的应答连不上网。 开始分析&#xff0c;排除软件问题&#xff0c;给EC模块发为什么没应答&#xff1f; 1.发送失败 2.接收失败 排除情况2&#x…

汽车租赁系统1.0版本

汽车租赁系统1.0版本比较简陋&#xff0c;以后还会有2.0、3.0……就像《我爱发明》里面的一代机器二代机器&#xff0c;三代机器一样&#xff0c;是一个迭代更新的过程&#xff08;最近比较忙&#xff0c;可能会很久&#xff09;&#xff0c;这个1.0版本很简陋&#xff0c;也请…

Python+Pytest框架,“api_key.py文件怎么编写“?

1、在"api_keyword"文件夹下新增"api_key.py" import allure import requests import json import jsonpath from deepdiff import DeepDifffrom config import *allure.title("测试用例执行") class ApiKey:allure.step(">>>:开…

跨平台开发新视角:利用Android WebView实现Web内容的原生体验

在移动应用开发领域&#xff0c;跨平台解决方案一直是一个热门话题。开发者们不断寻求能够同时在iOS和Android平台上提供一致用户体验的方法。而Android的WebView组件&#xff0c;作为一个强大的工具&#xff0c;允许开发者在Android应用中嵌入Web内容&#xff0c;为用户提供接…

Maven从入门到精通(三)

一、Settings 配置 settings.xml 用来配置 maven 项目中的各种参数文件&#xff0c;包括本地仓库、远程仓库、私服、认证等信息。 全局 settings、用户 setting、pom 的区别&#xff1a; 全局 settings.xml 是 maven 的全局配置文件&#xff0c;一般位于 ${maven.home}/conf…

安全工具 | 使用Burp Suite的10个小tips

Burp Suite 应用程序中有用功能的集合 img Burp Suite 是一款出色的分析工具&#xff0c;用于测试 Web 应用程序和系统的安全漏洞。它有很多很棒的功能可以在渗透测试中使用。您使用它的次数越多&#xff0c;您就越发现它的便利功能。 本文内容是我在测试期间学到并经常的主要…

音视频入门基础:AAC专题(4)——ADTS格式的AAC裸流实例分析

一、ADTS格式的AAC裸流实例分析 在《音视频入门基础&#xff1a;AAC专题&#xff08;3&#xff09;——AAC的ADTS格式简介》中对AAC的ADTS格式进行了简介。下面用一个具体的例子来对ADTS格式的AAC裸流进行分析。 通过《音视频入门基础&#xff1a;AAC专题&#xff08;2&#x…