集合

单列集合

储存基本数据类需要包装类(泛型需要引用数据类型)

 

Collection 单列集合

  add     (boolean) remove     

//条件删除

//boolean test(String s)

(boolean)removeif(         //删除长度为三的字符串

  (String s)->{

        return s.length()==3;

}

) 

clear() 清空集合中所有的元素

(boolean)contains()是否存在该元素

(boolean)isEmpty() 判断是否为空

(int)size() 集合中元素的个数

 

package com.yang.my_arrylist;

import java.util.ArrayList;
import java.util.Collection;

public class MyArrylist {
    public static void main(String[] args) {
        Collection<String> collection=new ArrayList();
        //增加
         collection.add("aaa");
         collection.add("bbb");
         collection.add("ccc");
         collection.add("cccc");
        System.out.println(collection);
        //删除
        System.out.println(collection.remove("aaa"));
        System.out.println(collection.remove("111"));
       //删除长度为三的元素
        collection.removeIf((String s)->{
            return s.length()==3;
        });
        System.out.println(collection);
        //是否为空
        System.out.println(collection.isEmpty());
        //集合元素的个数
        System.out.println(collection.size());
        //是否包含"cccc"
        System.out.println();collection.contains("cccc");
        //清空集合
        System.out.println();collection.clear();
        System.out.println(collection);

    }

}

 

集合遍历   通过迭代器  Iteraor

                                                            方法

  Iterator< > iterator =collection.iterator();

  Iterator<e(集合的泛型)> iterator() 返回集合中的迭代器对象,迭代器对象默认集合的0索引

//当前位置是否有元素

hasNext()

//取出当前位置元素,将迭代器往后移动一位

next()

package com.yang.my_arrylist;

import javax.swing.text.html.HTMLDocument;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class Iterator_list {
    public static void main(String[] args) {
         {
             //使用迭代器遍历集合
             Collection<String> collection=new ArrayList<>();
             ((ArrayList<String>) collection).add("aaa");
             ((ArrayList<String>) collection).add("bbb");
             ((ArrayList<String>) collection).add("bbb");
        //从集合中返回一个迭代器对象,默认索引 Iterator<String> iterator=collection.iterator(); //hasNext判断当前位置是否有元素 while (iterator.hasNext()){ //返回当前元素,并将迭代器指向下一个位置,起始位置为集合0索引 System.out.println(iterator.next()); } } } }

 

使用迭代器删除

普通方法删除,在删除一个集合元素后,集合会向前移动一位,需要集啊i--

使用迭代器 因为迭代器与集合索引相对应,删除后保持集合和迭代器对象元素相一致;

iterator.remove();删除后会指向上一次的位置;

package com.yang.my_arrylist;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class Iterator_delete {
    public static void main(String[] args) {
        Collection<String> collection=new ArrayList<>();
        collection.add("a");
        collection.add("b");
        collection.add("b");
        collection.add("c");
        Iterator<String> iterator=collection.iterator();
//        使用迭代器中的remove方法删除,remove()删除一个元素后,会将迭代器变为上一个集合中的元素
//        删除过程集合中元会与迭代器中的元素保持一致        
      while (iterator.hasNext()){ if (iterator.next().equals("b")){ iterator.remove(); } } System.out.println(collection); } }

 增强for循环 简化数组和Collection的集合遍历

Map 双列集合能不直接使用迭代器 和增强for

增强for中修改第三变量不会修改集合中的元素

引用数据的地址也是不能修改的,但是可以修改里面的内容,入类通过set方法;

List add get(int index) set(int index)remove(int index) 

LinkedList                         

list.add()    list.addFirst    list.addLast()   list.getFirst()  list.getLast()   list.removeFirst()   list.removeLast()

 

package com.yang.wolf_battle_shoper;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;

public class FightAgainstLandlord {
    public static void main(String[] args) {
        //准备一副新的扑克
        String[] color={"♠","♣","♥","♦"};
        String[] nums={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
        ArrayList<String> arrayList=new ArrayList<>();
        arrayList.add("大王");
        arrayList.add("小王");
        for (String s : color) {
            for (String num : nums) {
                arrayList.add(s+num);
            }
        }
        //洗牌  调用方法随机打乱数组
        Collections.shuffle(arrayList);
        //建立玩牌的人 和底牌
        ArrayList<String> arrayList1=new ArrayList<>();
        ArrayList<String> arrayList2=new ArrayList<>();
        ArrayList<String> arrayList3=new ArrayList<>();
        ArrayList<String> arrayList0=new ArrayList<>();
        //发牌
        for (int i = 0; i < arrayList.size(); i++) {
            if(i>=51){
                arrayList0.add(arrayList.get(i));
            }else if(i%3==0){
                arrayList1.add(arrayList.get(i));
            }else if(i%3==1){
                arrayList2.add(arrayList.get(i));
            }else if(i%3==2){
                arrayList3.add(arrayList.get(i));
            }
        }
        System.out.println("底牌是 :"+arrayList0+"有"+arrayList0.size()+"牌");
        System.out.println("周润发 :"+arrayList1+"有"+arrayList1.size()+"牌");
        System.out.println("刘德华 :"+arrayList2+"有"+arrayList2.size()+"牌");
        System.out.println("周星驰 :"+arrayList3+"有"+arrayList3.size()+"牌");



    }
}

 Set集合 

  1 没有带索引的1相关方法

  2 不能存处重复数据

  3 元素存取无序

TreeSet 对set集合排序 (自然排序,比较器排序)对内部元素按照规则进行排序

自然排序  Conparable

自定义类 要Implements  Comparable           this代表正要存 o代表存进去的

重写 compareTo(类 o){

  this.getXxx-O.getXxx()  

        if(result==0)写次要比较

   return 负数 存左边/正数存右边/0重复了

}

TreeSet<M>  Comparable<E>  代码实例

package com.yang.SetList.Comparable;

import org.omg.CORBA.PUBLIC_MEMBER;

public class Student implements Comparable<Student>{
    public String name;
    public int age;

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

    public Student() {
    }

    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 "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }


    @Override
    public int compareTo(Student o) {
        int i=this.age-o.age;
        if (i==0){
            return this.name.compareTo(o.name);
        }
        return this.age - o.age;
    }

}

  

package com.yang.SetList.Comparable;

import org.omg.CORBA.PUBLIC_MEMBER;

public class Student implements Comparable<Student>{
    public String name;
    public int age;

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

    public Student() {
    }

    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 "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }


    @Override
    public int compareTo(Student o) {
        int i=this.age-o.age;
        if (i==0){
            return this.name.compareTo(o.name);
        }
        return this.age - o.age;
    }

}

 更改TreeSet中的排序规则(比较器排序)

 

package com.yang.text_set_treeset_comparator;

import java.util.Comparator;
import java.util.Scanner;
import java.util.TreeSet;

public class MyComparator {
    public static void main(String[] args) {
        TreeSet<Integer> treeSet=new TreeSet<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        });
        Scanner scanner=new Scanner(System.in);
        while (true){
            int flag=0;
            System.out.println("输入0结束");
            flag=scanner.nextInt();
            if (flag==0){
                break;
            }
            int num=scanner.nextInt();
            treeSet.add(num);
        }
        for (Integer integer : treeSet) {
            System.out.println(integer);
        }
    }
}

  TreeSet 数据结构红黑树

  平衡二叉B树 每一个节点红或者黑树 红黑树允许高度不平衡的它有“自己的红黑规则”

红黑规则5

   1 每一个节点红或者黑

  2  根节点 黑色

  3  如果一个节点没有子节点或者父节点,则该节点相应的指针属性为NIL,这些nil看为叶子节点,每个叶子节点视为黑色。

  4如果某一个节点是红色的,那么他的子节点必须是黑色的

  5 对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同个数的黑色节点

 添加节点  默认红色效率更高

跟节点

     直接变为黑色

非根节点

    父节点为黑色

    不需要任何操作

    父节点为红色

      叔叔节点为红色

                       两个红色节点相连,父 叔 变为黑色   祖父节点变为红色

          祖父节点为根节点

              如果祖父为根节点在变为黑色

      叔叔节点为黑色

      父节点变黑,祖父节点变红,根据平衡二叉树规则进行选旋转

      

 Hashset 

   不能保证存储和取出的书序完全一致

   Set集合数据唯一

 底层数据结构式哈希表

  没有索引

 哈希值 jdk根据对对象的地址值或者属性值,算出来的int 整数

 hashcode()获得哈希值

 //Objext 根据地址计算哈希值

想要两个对象的内容不一样,不能重复显示,重写hashcode方法根据属性值计算哈希值(少部分情况 属性值不一样,哈希值也相同)

 HashSet集合元素唯一原理 

    哈希表+红黑树(jdk8)

    哈希表:数组+链表

    哈希值一样,在调用重写的equals方法比较属性值

    链表插入采用头插法

    链表数据挂载数据到达了个,自动转化为红黑树的结构

 

 LinkedHashSet能保证存取顺序

 

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2021-10-11 12:24  互联.王  阅读(39)  评论(0编辑  收藏  举报