java集合 之泛型 删除方法 排序 复合嵌套

泛型

1.增加了代码安全性

2.省去了强转换的麻烦

泛型类 是在创建 对象的时候 给泛型缚类型

    // 声明一个集合 保存adbcd 迭代器遍历
        // 泛型:声明集合中保存的元素什么类型

        ArrayList<String> arrayList = new ArrayList<String>();

        arrayList.add("a");
        arrayList.add("b");
        arrayList.add("c");
        arrayList.add("d");
        ListIterator<String> listIterator = arrayList.listIterator();
        while(listIterator.hasNext()) {
            String next = listIterator.next();
            System.out.println(next);
        }
//      逆向遍历
//      判断前一个元素是否有值
        while(listIterator.hasPrevious()) {
            // 取除前一个元素
            String previous = listIterator.previous();
            System.out.println(previous);


        }
        //需求 集合中保存了3个学生对象迭代器遍历(使用泛型)
        // 在jdk1.7菱形泛型
        // 后面泛型 可以不写 如果不写 默认和声明泛型一致
        // 如果你前后泛型 都写 必须保持一致
        ArrayList<Student> arrayList = new ArrayList<Student>();
        arrayList.add(new Student("王龙",39));
        arrayList.add(new Student("越哥",20));
        arrayList.add(new Student("越爷",24));
        ListIterator<Student> listIterator = arrayList.listIterator();
        while(listIterator.hasNext()) {
            Student next = listIterator.next();
            System.out.println(next.getName());

        }
        ArrayList<Student> list = new ArrayList<>();
        list.add(new Student("王龙",39));
        list.add(new Student("王龙",39));
        list.add(new Student("王龙",39));
//      Person person =(Person)list.listIterator().next();
//      System.out.println(person.getName());

        // 泛型 可以 将运行时 的错误 转到编译期
//      Worker next = (Worker)list.iterator().next();
        Worker.work();

泛型 的表示<任意的大写字母>

类的泛型

public class Worker<T> {

    private  T t;
    private  String name;
    public String toString() {
        return "T [T=" + t + "]";
    }
    public Worker() {
        super();
    }
    public Worker(T t) {
        super();
        this.t = t;
    }
    public T getT() {
        return t;
    }
    public void setT(T t) {
        this.t = t;
    }

    //泛型成员方法
    //除了T类型 我这里咳哟不尅写别的类型
    // 这里W没有被符类型 
    // 咱们需要表示 出来 再调用这个方法时候 创建 W类型
    public<W> void sayHi(W w) {
        System.out.println(w);

    }
    public static void work() {

        System.out.println("我是工人,我很开心");
    }
    //静态方法 自己的泛型
    // 静态方法自己的泛型
    public static<E> void print(E e) {


    }

}

泛型类的调用

Worker<String > worker = new Worker<>();
        worker.setT("haha");
        worker.sayHi("SB");
        System.out.println();

泛型接口

//直接在接口名 后面声明泛型
interface InterA<T>{
    void show(T t);
}
class InterAImpl implements InterA<String>{

    @Override
    public void show(String t) {
        // TODO Auto-generated method stub
        System.out.println(t);
    }

}

泛型安全性的例子

    // 创建两个数组 一个春Person
        //Student素组里村两人
            //把Student素组全添加到Person中
            ArrayList<Person> list1 = new ArrayList<>();
            ArrayList<Student> list2 = new ArrayList<>();
            list1.add(new Person("sb",12));
            list1.add(new Person("sn",13));
            list2.add(new Student("w",13));
            list2.add(new Student("s",14));
            list2.addAll(list1);//报错
            System.out.println(list2);

泛型规定了集合里能存放元素的类型
所以报错

泛型通配符

? extends E

其中问号是子类 E是父类

向下限定 只允许 子类或者孙子类

Collection

多参数测试

    // 遍历int数组的方法 

    //下列方法还能不能添加int类型参数
    // 如果多参数 那么int....num 必须放在最后
    public static void print(int a,int...num) {
        for (int i = 0; i < num.length; i++) {
            System.out.println(i);

        }

    }

asList方法

asList 把数组转为List

    //asList 把数组转为List
        //这里是把整个数组当成一个元素保存到集合中了
        // 因为集合中只能保存对象类型
        // 数组中元素不能自动装箱
        int[] array = {1,2,3,4,5};

        List<int[]> asList = Arrays.asList(array);
        System.out.println(asList);

        // 直接使用基本数据类型 包装类
        Integer[] newArray = new Integer[]{12,11,3,4};
        List<Integer> asList2 = Arrays.asList(newArray);
        System.out.println(asList2);

特别注意点

需求:

字符串数组转化为集合 并在集合中添加”liangliang”

    // 数组转化为集合不能对其进行添加 和删除的操作
        // 不支持添加删除有何意义
        // 意义在于 可以使用集合中其他方法
        String[] strings = {"wanglong","wangning"};

        List<String> asList = Arrays.asList(strings);
        asList.add("liangliang");//报错
        System.out.println(asList);

删除的3种方式(遍历的三种方式)

1.

    ArrayList<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("b");
        list.add("c");

        list.add("d");
        //如果集合中有"b"删除


        for (int i = 0; i <list.size(); i++) {
            if (list.get(i).equals("b")) {
                // i-- 表示每次删除后 都把角标跳一次
                // 为了保证 删除后也能便利到数组每一个元素
                // ListIterator
                list.remove(i--);

            }


        }
        System.out.println(list);
    }

2

    ArrayList<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("b");
        list.add("c");

        list.add("d");
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {
            if(iterator.next().equals("b")) {
                //让迭代器去删除
                iterator.remove();
            }

        }
        System.out.println(list);

3.

ArrayList<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("b");
        list.add("c");
        //增强for循环遍历
        // 遍历
        // 冒号后 是你要遍历的容器
        // 冒号前 是你要便利的容器中的每个元素
        // 增强for循环底层 使用迭代器实现的
        // 一般只用来打印 不要做删除操作
        for (String string : list) {
            System.out.println(string);
        }

集合排序

    ArrayList<Student> list = new ArrayList<>();
        list.add(new Student("a",20));
        list.add(new Student("d",30));
        list.add(new Student("c",50));
        list.add(new Student("e",100));
        list.add(new Student("b",40));

        for (int i = 0; i < list.size()-1; i++) {
            for (int j = 0; j < list.size()-1-i; j++) {

                if(list.get(j).getName().compareTo(list.get(j+1).getName())>1) {
                    Collections.swap(list, j, j+1);//调用系统的交换方法
                }
            }
        }
        System.out.println(list);

Collections中的sort方法

这个方法是系统给你的排序方法

但是按什么排序 系统不知道要咋排序

这时系统给你一个接口让你去实现这个接口

接口中你要写 排序规则 (回掉思想)

集合中盛放的时神么对象 就让该对象趋势线这个接口(拍谁谁实现)

使用Collections中sort方法排序步骤

1.让集合中被排序的对象的类 去实现Comparable接口

2.实现接口中抽象方法(排序是什么规则的方法)

3.编写排序规则

4.调用Collections.sort测试

    ArrayList<Student> list = new ArrayList<>();
        list.add(new Student("a",20));
        list.add(new Student("d",30));
        list.add(new Student("c",50));
        list.add(new Student("e",100));
        list.add(new Student("b",40));
        //调用系统方法
        // (底层调用了实现接口中的排序方法)
        Collections.sort(list);
        System.out.println(list);

重写代码

    public int compareTo(Student o) {
        // TODO Auto-generated method stub
        // Comparable接口中的抽象方法
        // 这个抽象方法 让你去写排序规则

//      System.out.println("我执行了");
        return (int)this.getName().charAt(0)-(int)o.getName().charAt(0);
    }

集合嵌套

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值