zoukankan      html  css  js  c++  java
  • 寒假Day56:JAVA集合Set+TreeSet+List+Map

    java集合简单介绍

    存放在java.util包中,集合可以存放不同的数据类型

    java集合分为Set、List、Map

    下面所说的有序和无序不是指集合中的排序,而是是否按照元素添加的顺序来存储对象

    Set:无序、不可重复

    List:有序、可重复

    Map:具有映射关系


    Set

    遍历set集合中的元素:

    方法一:

    //迭代器遍历集合
    Iterator it = set.iterator();
    //hasNext()判断迭代器中是否还有下一个元素 有ture
    //next() 获取下一个元素
     while (it.hasNext()) {
        System.out.println(it.next());
    }

    注意:使用迭代器的时候,不能仅仅只导入HashSet和Set,必须要导入util包,否则报错。

    import java.util.*;

    报错如下:

    方法二:

    //遍历二:for each迭代集合
    //set中的每一个元素赋值给obj
    for (Object obj : set) {
        System.out.println(obj);
    }

    Set操作完整代码:

    import java.util.Collections;
    import java.util.HashSet;
    import java.util.Set;
    import java.util.*;
    
    public class A {
        public static void main(String[] args) {
            Set set = new HashSet();
            //等价于Set<Object> set =new HashSet<Object>();
            set.add(1);
            set.add("a");//set里可以存不同类型的对象
            //如果只想存同一类型,那么引入泛型
            //则写成Set<String> set=new HashSet<String>();
            set.remove(1);
            // System.out.println(set);
            System.out.println(set.contains("a"));
            set.clear();//[]
            set.add(1);
            set.add(2);
            set.add(null);//可以存取null,会被放在set集合的第一个位置,因为是按照hashcode值排列的
            set.size();//获取集合元素个数
    
            //遍历一:
            //迭代器遍历集合
            Iterator it = set.iterator();
            //hasNext()判断迭代器中是否还有下一个元素 有ture
            //next() 获取下一个元素
            while (it.hasNext()) {
                System.out.println(it.next());
            }
    
            //遍历二:for each迭代集合
            //set中的每一个元素赋值给obj
            for (Object obj : set) {
                System.out.println(obj);
            }
            //两个对象相等:equals相等、hasCode返回值相等
    
        }
    }

    TreeSet

    支出两种排序方法:自然排序和定制排序。默认自然排序。 

    基本操作+自然排序:

    import java.util.Set;
    import java.util.TreeSet;
    
    public class A{
        public static void main(String[] args){
            Set<Integer> set=new TreeSet<Integer>();
            set.add(5);
            set.add(2);
            set.add(4);
            set.add(3);
            System.out.println(set);//TreeSet的自然排序
            //output:[2, 3, 4, 5]
            //其他一些操作和set一样
            //Interator<Integer> it=....
            //for(In teger i:set){
            //}
        }
    }

    自定义排序:

    TreeSet如何实现自定义排序?
    需要提供一个Comparator接口的实现类对象,
    然后新建一个类Person,把Person对象存到TreeSet中且按年龄排序,
    再实现一个接口,
    接着写两个构造,一个无参数,一个有参数。

    import java.sql.PseudoColumnUsage;
    import java.util.Comparator;
    import java.util.Set;
    import java.util.TreeSet;
    
    public class A {
        public static void main(String[] args) {
            Set<Person> set = new TreeSet<Person>(new Person());
            Person p1 = new Person("Bob", 30);
            Person p2 = new Person("Alice", 10);
            Person p3 = new Person("Cindy", 20);
            set.add(p1);
            set.add(p2);
            set.add(p3);
            for (Person p : set) {
                System.out.println(p.name + "-->" + p.age);
            }
        }
    }
    
    class Person implements Comparator<Person> {
        int age;
        String name;
    
        public Person() {
    
        }
    
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }//使对象实例化
    
        @Override
        public int compare(Person o1, Person o2) {//重写了compare这个方法
            if (o1.age > o2.age) {
                return 1;
            } else if (o1.age < o2.age) {
                return -1;
            } else {
                return 0;
            }
        }
    }

    输出:

    注意:

    如果把他们的年龄全部改成一样的,输出就只有第一个人的信息。


    List

    List是一个接口,所以List集合要有一个实现类,主要的实现类就是ArrayList。

    基本操作:

    import java.sql.Array;
    import java.util.ArrayList;
    import java.util.*;
    
    public class A {
        public static void main(String[] args) {
            List<String> list = new ArrayList<String>();
            list.add("11");
            list.add("22");
            list.add("33");
            //list.get(2);//访问list下表为2的元素
            //list.add(1,"a");//在下标为1的位置插入a,其他元素后移
            List<String> list2 = new ArrayList<String>();
            list2.add("insert");
            list.addAll(1, list2);//在list中插入list2
            System.out.println(list);//output:[11, insert, 22, 33]
            // list.indexOf("11");//获取该元素在list中出现的第一次的下表
            // list.lastIndexOf("11");
            //list.remove(2);//remove该下标对应的数据
            //list(1,"ff");//把1下标的位置元素改成ff
            // List<String> sublist=list.subList(2,4);//截取下标2-3元素(左开右闭)
        }
    }

    Map

    在java中,Map是一个接口,自然就需要一个实现类,就是HashMap类。

     基本操作:

    import java.util.HashMap;
    import java.util.*;
    import java.util.Map;
    
    public class A {
        public static void main(String[] args) {
            Map<String, Integer> map = new HashMap<String, Integer>();
            //key-value
            map.put("b", 9);//和前面两个不一样,不是add
            map.put("a", 3);
            map.put("c", 7);
            System.out.println(map);//{a=3, b=9, c=7}按照key排序
            System.out.println(map.get("b"));//9 根据key取出值
            map.remove("c");//根据key移除键值对
            System.out.println(map.containsKey("a"));//判断是否存在key /true
            System.out.println(map.containsValue(10));//judge value /false
    
            Set<String> keys = map.keySet();//获取所有key
            map.values();//获取所以value
    
            //遍历一:集合,map.keySet()
            for (String key : keys) {
                System.out.println("key:" + key + " " + "value:" + map.get(key));
            }
    
    //        //遍历二:map.entrySet();效率更高
    //        Set<Entry<String, Integer>> entrys = map.entrySet();
    //        for (Entry<String, Integer> en : entrys) {
    //            System.out.println("key:" + en.getKey() + " " + "value:" + en.getValue());
    //        }//这个不知道为什么我这边会报错??
    
    
        }
    }

    待解决:

    上面的map中基本操作中不知道为什么Entry会报错。

  • 相关阅读:
    Shell编程之运算符和环境变量配置文件
    Shell编程之变量
    PCI BAR设置过程[转]
    基于ARM的SoC设计入门[转]
    负载均衡
    [转]vc中调用其他应用程序的方法(函数) winexec,shellexecute ,createprocess
    VC/DDK/DriverWorks开发环境配置
    windows下注册表脚本编写
    _cdecl与_stdcall区别
    在C语言中破坏函数调用堆栈
  • 原文地址:https://www.cnblogs.com/OFSHK/p/12534876.html
Copyright © 2011-2022 走看看