Java树集//树映射//线程

树集

TreeSet泛型类

由TreeSet类创建的对象称为树集
树集采用树结构存储数据,树节点中的数据会按存放数据的"大小"顺序进行排序,在同一层中的结点从左到右,从大到小的顺序递增排列,下一层都比上一层的小

TreeSet<String> mytree = new TreeSet<String>();	//创建一个树集

然后可以调用add()方法往树集添加结点

mytree.add("boy")
mytree.add("girl")

结点的大小关系

String类实现了Comparable接口中的compareTo(Object str)方法,字符串对象调用compareTo(String s)方法按字典序与参数s指定的字符串比较大小,也就是说两个字符串对象知道怎样比较大小
实现Comparable接口类创建的对象可以调用compareTo(Object str)方法和参数指定的对象比较大小关系,假如a和是实现Comparable接口类创建的两个对象,当a.compareTo(b)<0时,也就是说a<b;如此类推

TreeSet常用方法

  • public boolean add(E o) //添加结点
  • public void clear() //删除树集所有结点
  • public void contains(Object o) //是否拥有结点o
  • public E first() //返回树集的第一个结点(最小的结点)
  • public E last() //返回树集的最后一个结点(最大的结点)
  • public isEmpty() //判断树集是否为空
  • public boolean remove(Object o) //删除树集的结点,成功为ture
  • public int size() //返回树集中结点的数量

使用树集对学生的英语成绩进行排名的例子

import java.util.Iterator;
import java.util.TreeSet;

class Student implements Comparable {
    String name;    //名称
    int English;    //英语成绩

    Student() {
    }

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

    @Override
    public int compareTo(Object o) {    //重写Comparable接口的方法
        Student student = (Student) o;   //将对象转为Student
        return (this.English - student.English);    //比较英语成绩()
    }
}

public class Example13_8 {
    public static void main(String[] args) {
        TreeSet<Student> myTree = new TreeSet<Student>();
        Student st1, st2, st3;    //三个学生对象
        st1 = new Student("小明", 58);
        st2 = new Student("大明", 98);
        st3 = new Student("小刚", 88);
        myTree.add(st1);
        myTree.add(st2);
        myTree.add(st3);
        Iterator<Student> iterator = myTree.iterator(); //树集的迭代器
        while (iterator.hasNext()) { //如果树集有结点的话就输出
            Student stu = iterator.next();  //将结点放到一个对象中
            System.out.println("姓名:" + stu.name + " " + "英语成绩:" + stu.English);
        }
    }
}

运行结果

D:\HelloWorld\out\production\HelloJava Chapter_13.Part_4.Example13_8
姓名:小明 英语成绩:58
姓名:小刚 英语成绩:88
姓名:大明 英语成绩:98

进程已结束,退出代码 0

需要注意的是

树集中不允许出现大小相等的两个结点,如有需要的话可以重写Comparable接口中的方法//

树映射

TreeMap<K,V>类实现了Map<K,V>接口,称TreeMap<K,V>对象称为树映射
树映射使用public V put(K key,V value),方法添加结点
和树集不同树映射是按照结点中的关键字进行升序排列的

同样是学生成绩的例子

import java.util.Collection;
import java.util.Iterator;
import java.util.TreeMap;

class StudentKey implements Comparable { //用于排序成绩
    double d;

    StudentKey() {

    }

    StudentKey(double d) {   //传入成绩
        this.d = d;
    }

    @Override
    public int compareTo(Object o) {
        StudentKey studentKey = (StudentKey) o;
        if (this.d - studentKey.d == 0) {  //如果成绩相同的话也添加
            return -1;
        } else {
            return (int) ((this.d - studentKey.d) * 1000);    //因为成绩相减为负的浮点
        }
    }
}

class Students {    //学生类
    String name;
    double English;
    double Math;

    Students(String name, double English, double Math) {
        this.name = name;
        this.English = English;
        this.Math = Math;
    }

}

public class Example13_9 {
    public static void main(String[] args) {
        TreeMap<StudentKey, Students> myTree = new TreeMap<StudentKey, Students>();
        String name[] = {"小红", "小绿", "小黑"};   //名称数组
        double English[] = {98, 66, 79};
        double Math[] = {88, 56, 98};
        Students students[] = new Students[3];
        for (int i = 0; i < students.length; i++) {
            students[i] = new Students(name[i], English[i], Math[i]);
        }
        StudentKey studentKey[] = new StudentKey[3];
        for (int i = 0; i < studentKey.length; i++) {
            studentKey[i] = new StudentKey(students[i].English);    //将英语成绩录入
        }
        for (int i = 0; i < students.length; i++) {
            myTree.put(studentKey[i], students[i]);
        }
        Collection<Students> collection = myTree.values();  //将树映射的值放到一个集合对象中
        Iterator<Students> iterator = collection.iterator();    //使用迭代器
        while (iterator.hasNext()) {
            Students students1 = (Students) iterator.next();
            System.out.println("姓名:" + students1.name + " " + "英语成绩" + students1.English);
        }
        System.out.println();
        myTree.clear(); //清空树集
        for (int i = 0; i < studentKey.length; i++) {
            studentKey[i] = new StudentKey(students[i].Math);    //将数学成绩录入以作比较
        }
        for (int i = 0; i < students.length; i++) {
            myTree.put(studentKey[i], students[i]);
        }
        collection = myTree.values();  //将树映射的值放到一个集合对象中
        iterator = collection.iterator();
        while (iterator.hasNext()) {
            Students students1 = (Students) iterator.next();
            System.out.println("姓名:" + students1.name + " " + "数学成绩" + students1.Math);
        }

    }
}

运行结果

D:\HelloWorld\out\production\HelloJava Chapter_13.Part_4.Example13_9
姓名:小绿 英语成绩66.0
姓名:小黑 英语成绩79.0
姓名:小红 英语成绩98.0

姓名:小绿 数学成绩56.0
姓名:小红 数学成绩88.0
姓名:小黑 数学成绩98.0

进程已结束,退出代码 0

线程

  • 线程的基本概念
    线程是比进程更小的能独立运行的基本单位
    线程是进程中的一个实体,是CPU调度和分派的基本单位
    线程同样也有就绪等待和运行三种基本状态

  • 线程的属性
    每个线程都有一个唯一的标识符和一张线程描述表
    不同的线程可以执行相同的程序
    同一进程中各个线程共享进程的内存地址空间
    线程是处理机的独立调度单位,多个线程是可以并发执行的
    线程在生命周期内会经历等待,就绪,运行三种状态

  • 引入线程的好处
    通过创建线程来完成任务,以减少程序并发执行时付出的时空开销
    创建一个新线程花费的时间少
    切换线程的时间也少
    线程能独立运行

CET4P184

  • solar
  • correspondence
  • consequently
  • insist
  • liberty
  • virus
  • flourish
  • pronoun
  • ambulance
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值