黑马程序员——Java基础——集合类_3

集合类

collections——sort、max、binarySreach
public static<T extends Comparable<? super T>> void sort(List<T> list){
//此泛型表示,限定类型需继承Comparable类具备比较性
//比较器限定为可接受T类型或T的父类
}
public class CollectionsDemo {
    public static void main(String[] args){
        sortDemo();
        maxDemo();
        binarySearchDemo();
    }
    public static void sortDemo(){
        List<String> list = new ArrayList<String>();
        list.add("abcd");
        list.add("kkkkk");
        list.add("aaaa");
        list.add("z");
        list.add("kkkkk");
        list.add("qq");

        sop(list);
        Collections.sort(list);
        sop(list);

        Collections.sort(list, new StrLenComparator());
        sop(list);
    }
    public static void maxDemo(){
        List<String> list = new ArrayList<String/*new StrLenComparator()*/>();
        list.add("abcd");
        list.add("kkkkk");
        list.add("aaaa");
        list.add("z");
        list.add("kkkkk");
        list.add("qq");

        String max = Collections.max(list);
        sop(max);
    }
    public static void binarySearchDemo(){
        List<String> list = new ArrayList<String/*new StrLenComparator()*/>();
        list.add("abcd");
        list.add("kkkkk");
        list.add("aaaa");
        list.add("z");
        list.add("kkkkk");
        list.add("qq");
        Collections.sort(list);
        sop(list);
        //使用binarySearch进行二维查找必须是有序集合
        int index = Collections.binarySearch(list, "aaaa");
        sop("index=" + index);
    }
    public static void sop(Object obj){
        System.out.println(obj);
    }
    //自定义binarySearch方法
    public static int halfSerch(List<String> list, String key){
        int max,min,mid;
        max = list.size() - 1;
        min = 0;
        while(min <= max){
            mid = (max + min) >> 1;
            String str = list.get(mid);
            int num = str.compareTo(key);
            if(num > 0)
                max = mid - 1;
            else if(num < 0)
                min = mid + 1;
            else
                return mid;
        }
        return -min - 1;
    }
}
class StrLenComparator implements Comparator<String>{
    public int compare(String s1, String s2) {
        if(s1.length()>s2.length())
            return 1;
        if(s1.length()<s2.length())
            return -1;
        return s1.compareTo(s2);
    }
}
collections——替换反转fill、replaceAll、reverse

Collections.fill(list, object)方法:将集合中的所有元素替换成object元素

public class CollectionsDemo2 {
    public static void main(String[] args){
        fillDemo();
        replaceAllDemo();
    }
    public static void fillDemo(){
        List<String> list = new ArrayList<String>();
        list.add("abcd");
        list.add("aaaa");
        list.add("zz");
        list.add("kkkkk");
        sop(list);
        Collections.fill(list, "pp");
        sop(list);
    }
    public static void replaceAllDemo(){
        List<String> list = new ArrayList<String>();
        list.add("abcd");
        list.add("aaaa");
        list.add("zz");
        list.add("kkkkk");
        sop(list);
        Collections.replaceAll(list, "aaaa", "p");
        sop(list);
        Collection.reverse(list);
        sop(list);
    }
    public static void sop(Object obj){
        System.out.println(obj);
    }
}

练习:fill方法可以将集合中的所有元素替换成制定元素,请实现将集合中的部分元素替换成制定元素

public static void fillDemo(List, start, end){

}
Collections——reverseOrder

Collections.reverseOder();
1. 返回一个逆向自然序比较器

public class CollectionsDemo3 {
    public static void main(String[] args){
        orderDemo();
    }
    public static void orderDemo(){
        TreeSet<String> ts = new TreeSet<String>(Collections.reverseOrder());
        ts.add("abcde");
        ts.add("aaa");
        ts.add("kkk");
        ts.add("ccc");
        Iterator<String> it = ts.iterator(); 
        while(it.hasNext()){
            System.out.println(it.next());
        }
    }
}
  1. 强行逆转一个已有比较器
public class CollectionsDemo3 {
    public static void main(String[] args){
        orderDemo();
    }
    public static void orderDemo(){
        TreeSet<String> ts = new TreeSet<String>(Collections.reverseOrder(new StrLenComparator()));
        ts.add("abcd");
        ts.add("abc");
        ts.add("a");
        ts.add("ab");
        Iterator<String> it = ts.iterator(); 
        while(it.hasNext()){
            System.out.println(it.next());
        }
    }
}
class StrLenComparator implements Comparator<String>{
    public int compare(String s1, String s2) {
        if(s1.length()>s2.length())
            return 1;
        if(s1.length()<s2.length())
            return -1;
        return s1.compareTo(s2);
    }
}
Collections——SynList

//将集合中的角标对应的值互换
Collections.swap(list, 1, 2);
//随机排列集合中的元素(模拟洗牌动作、掷骰子动作)
Collections.shuffle(list);
Arrays
用于操作数组的工具类
asList:将数组变成List集合
如果数组中的元素都是对象,那么变成集合是,数组中的元素就直接转成集合中的元素
如果数组中的元素都是基本数据类型,那么会将该数据作为集合中的元素存在

public class ArraysDemo {
    public static void main(String[] args){
        String[] arr = {"abc", "cc", "kkkk"};
        /*
         * 把数组变成List集合的好处
         * 可以使用集合的思量和方法来操作数据中的元素
         */
        List<String> list = Arrays.asList(arr);
        sop(list.contains("cc"));
        /*
         * list.add("qq");
         * 抛出:UnsupportedOperationException
         * 强数组变成集合,不能使用集合的增删方法,因为数组的长度是固定的
         * 如果增删,会抛出不支持操作异常
         */
        sop(list);
    }
    public static void sop(Object obj){
        System.out.println(obj);
    }
}
增强for循环

for(数据类型 变量名: 被遍历的集合(Collection)或者数据){
**;
}
//增强for循环的局限性,只能取出不能修改值

public class ForEachDemo { 
    public static void main(String[] args){
        ArrayList<String> al = new ArrayList<String>();
        al.add("abc1");
        al.add("abc2");
        al.add("abc3");
        Iterator<String> it = al.iterator();

        for(String temp: al){
            System.out.println(temp);
        }
    }
}

//传统for循环和高级for循环的区别
高级for有一个局限性,必须有一个被遍历的目标
在遍历数组的时候,还是使用传统for,因为传统for可以指定脚标

可变参数

在使用可变参数新特性的时候要注意,可变参数要定义在参数列表的最后面

public static void show(String str, int... arr){}
public class ParamMethodDemo {
    public static void main(String[] args){
        //show(3,4);    
        /*
        int[] arr1 = {3, 4};
        show(arr1);
        int[] arr2 = {3, 4, 5};
        show(arr2);
        */  
        //可变参数,是上一种数组参数的简写形式,不用每一次都手动的简历数组对象
        //只要将要操作的元素作为参数传递即可,隐式将这些参数封装成了数组
        show(2,3,4,5,7,6);
    }
    /*
    public static void show(int a, int b){
        System.out.println(a + "::" + b);
    }
    public static void show(int a, int b, int c){
        System.out.println(a + "::" + b + "::" + c);
    }
    */
    //新特性虽然少定义了多个方法,但是每次都要定义一个数组作为实际参数  
    /*
    public static void show(int[] arr){
        System.out.println(arr);
    }
    */
    public static void show(int... arr){
        System.out.println(arr);
    }
}
静态导入

当类名重名时,需要指定具体的包名
当方法重名时,指定具备所属的对象或者类

import java.util.*;
import static java.util.Arrays.*;
import static java.lang.System.*;

public class StaticImport {
    public static void main(String[] args){
        int[] arr = {1, 3, 5};
        //Arrays.sort(arr);未静态导入
                sort(arr);//静态导入
        //int index = Arrays.binarySearch(arr, 1);未静态导入
        int index = binarySearch(arr, 1);//静态导入
        //System.out.println(Arrays.toString(arr));未静态导入
        System.out.println(Arrays.toString(arr));//静态导入,但是不同类中有相同名称的方法
        System.out.println("Index =" + index);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1 目标检测的定义 目标检测(Object Detection)的任务是找出图像中所有感兴趣的目标(物体),确定它们的类别和位置,是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具有挑战性的问题。 目标检测任务可分为两个关键的子任务,目标定位和目标分类。首先检测图像中目标的位置(目标定位),然后给出每个目标的具体类别(目标分类)。输出结果是一个边界框(称为Bounding-box,一般形式为(x1,y1,x2,y2),表示框的左上角坐标和右下角坐标),一个置信度分数(Confidence Score),表示边界框中是否包含检测对象的概率和各个类别的概率(首先得到类别概率,经过Softmax可得到类别标签)。 1.1 Two stage方法 目前主流的基于深度学习的目标检测算法主要分为两类:Two stage和One stage。Two stage方法将目标检测过程分为两个阶段。第一个阶段是 Region Proposal 生成阶段,主要用于生成潜在的目标候选框(Bounding-box proposals)。这个阶段通常使用卷积神经网络(CNN)从输入图像中提取特征,然后通过一些技巧(如选择性搜索)来生成候选框。第二个阶段是分类和位置精修阶段,将第一个阶段生成的候选框输入到另一个 CNN 中进行分类,并根据分类结果对候选框的位置进行微调。Two stage 方法的优点是准确度较高,缺点是速度相对较慢。 常见Tow stage目标检测算法有:R-CNN系列、SPPNet等。 1.2 One stage方法 One stage方法直接利用模型提取特征值,并利用这些特征值进行目标的分类和定位,不需要生成Region Proposal。这种方法的优点是速度快,因为省略了Region Proposal生成的过程。One stage方法的缺点是准确度相对较低,因为它没有对潜在的目标进行预先筛选。 常见的One stage目标检测算法有:YOLO系列、SSD系列和RetinaNet等。 2 常见名词解释 2.1 NMS(Non-Maximum Suppression) 目标检测模型一般会给出目标的多个预测边界框,对成百上千的预测边界框都进行调整肯定是不可行的,需要对这些结果先进行一个大体的挑选。NMS称为非极大值抑制,作用是从众多预测边界框中挑选出最具代表性的结果,这样可以加快算法效率,其主要流程如下: 设定一个置信度分数阈值,将置信度分数小于阈值的直接过滤掉 将剩下框的置信度分数从大到小排序,选中值最大的框 遍历其余的框,如果和当前框的重叠面积(IOU)大于设定的阈值(一般为0.7),就将框删除(超过设定阈值,认为两个框的里面的物体属于同一个类别) 从未处理的框中继续选一个置信度分数最大的,重复上述过程,直至所有框处理完毕 2.2 IoU(Intersection over Union) 定义了两个边界框的重叠度,当预测边界框和真实边界框差异很小时,或重叠度很大时,表示模型产生的预测边界框很准确。边界框A、B的IOU计算公式为: 2.3 mAP(mean Average Precision) mAP即均值平均精度,是评估目标检测模型效果的最重要指标,这个值介于0到1之间,且越大越好。mAP是AP(Average Precision)的平均值,那么首先需要了解AP的概念。想要了解AP的概念,还要首先了解目标检测中Precision和Recall的概念。 首先我们设置置信度阈值(Confidence Threshold)和IoU阈值(一般设置为0.5,也会衡量0.75以及0.9的mAP值): 当一个预测边界框被认为是True Positive(TP)时,需要同时满足下面三个条件: Confidence Score > Confidence Threshold 预测类别匹配真实值(Ground truth)的类别 预测边界框的IoU大于设定的IoU阈值 不满足条件2或条件3,则认为是False Positive(FP)。当对应同一个真值有多个预测结果时,只有最高置信度分数的预测结果被认为是True Positive,其余被认为是False Positive。 Precision和Recall的概念如下图所示: Precision表示TP与预测边界框数量的比值 Recall表示TP与真实边界框数量的比值 改变不同的置信度阈值,可以获得多组Precision和Recall,Recall放X轴,Precision放Y轴,可以画出一个Precision-Recall曲线,简称P-R
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值