Java入门8(Comparator比较器,HashMap)

打印 上一主题 下一主题

主题 928|帖子 928|积分 2784

comparator比较器

​        Comparator不同于Comparable,使用更加的灵活,可以在不同场景下使用比较器,实际开发中,更推荐comparator比较器
  1. // 新建一个学生类,作为栗子
  2. public class Student {
  3.     private int sno;
  4.     private float height;
  5.     private float weight;
  6. }
  7. // 单独定义一个比较器类StudentHeightComparator,实现了Comparator接口里面的compare方法
  8. public class StudentHeightComparator implements Comparator<Student> {
  9.     @Override
  10.     public int compare(Student o1, Student o2) {
  11.         return Float.compare(o1.getHeight(), o2.getHeight());
  12.     }
  13. }
  14. // 使用comparator比较器
  15. public static void main(String[] args) {
  16.     List<Student> studentList = new ArrayList<>();
  17.     Random random = new Random();
  18.     for (int i = 0; i < 100; i++) {
  19.         Student studentTmp = new Student(i,100 + random.nextInt(100),50 + random.nextInt(50));
  20.         studentList.add(studentTmp);
  21.     }
  22.     // 创建比较器实例
  23.     Comparator<Student> c = new StudentHeightComparator();
  24.     // 把比较器实例当作参数传入sort方法
  25.     Collections.sort(studentList,c);
  26.     for (Student student : studentList) {
  27.         System.out.println(student);
  28.     }
  29. }
复制代码
Set接口常用实现类

三个常用实现类:TreeSet(基于Java红黑树,底层map),HashSet(哈希表,底层map),LinkedHashSet()
Set特点:

  • 不允许存储重复元素
  • 没有索引,不能通过普通for循环遍历
  • 不保证有序:存储顺序有可能和读取顺序不一致
HashSet 和 TreeSet区别:TreeSet 支持比较器
  1. // HashSet
  2. public static void main(String[] args) {
  3.     Set<Integer> set = new java.util.HashSet<>();
  4.     for (int i = 0; i < 10; i++) {
  5.         set.add(i);
  6.     }
  7.     // 无法存储重复元素
  8.     set.add(1);
  9.     // 无法保证存储和读取顺序一致
  10.     // 遍历的时候,调用了set重写的toString方法
  11.     System.out.println(set);
  12.     // 使用迭代器遍历set集合
  13.     Iterator<Integer> setIterator = set.iterator();
  14.     while (setIterator.hasNext()){
  15.         System.out.println(setIterator.next());
  16.     }
  17. }
复制代码
  1. // TreeSet
  2. // TreeSet底层使用的红黑树,红黑树是有序二叉树的一种
  3. // TreeSet支持在数据存储的时候提供比较器
  4. public static void main(String[] args) {
  5.     // 先创建比较器对象
  6.     Comparator<Student> c = new StudentHeightComparator();
  7.     // 创建TreeSet的同时提供比较器
  8.     java.util.TreeSet<Student> treeSet = new java.util.TreeSet<>(c);
  9.     // 插入数据
  10.     Random random = new Random();
  11.     for (int i = 0; i < 10; i++) {
  12.         Student studentTmp = new Student(i,100 + random.nextInt(100),50 + random.nextInt(50));
  13.         treeSet.add(studentTmp);
  14.     }
  15.     // 遍历
  16.     for (Student student : treeSet) {
  17.         System.out.println(student);
  18.     }
  19. }
复制代码
Map的常见实现类

三个常用实现类:HashMap,TreeMap,HashTable
HashMap

​        JDK中HashMap在1.7版本以及1.7版本之前使用的数组加链表的形式实现

  • HashMap存储的所有的Map集合都是双列集合,由key和value组成
  • Java底层使用一个Entry(键值对对象)的类负责存放key和value
  • HashMap要求key是不可以重复的,如果你存储了两个key相同的键值对,新的value就会替换掉原有的value
  1. public static void main(String[] args) {
  2.     Map<String,String> map = new HashMap<>();
  3.     // 插入键值对
  4.     map.put("Entry01","robot01");
  5.     map.put("Entry02","robot02");
  6.     map.put("Entry01","robot03");
  7.     System.out.println(map);
  8.     // map里只有两个键值对:{Entry01=robot03, Entry02=robot02}
  9.     // 可以通过key来获取(get)元素
  10.     System.out.println(map.get("Entry02")); // robot02
  11.     // size()返回键值对的数量
  12.     System.out.println(map.size()); // 2
  13.     // 是否有指定键,值
  14.     System.out.println(map.containsKey("Entry01")); // true
  15.     // 因为键相同,所以robot01被robot03所替代
  16.     System.out.println(map.containsValue("robot01")); // false
  17.     // 根据key去删除整个键值对
  18.     map.remove("Entry01");
  19.     System.out.println(map); // {Entry02=robot02}
  20.     // keySet() 将当前集合的所有key以Set集合的方式返回
  21.     map.put("Entry05","robot05");
  22.     System.out.println(map.keySet()); // [Entry05, Entry02]
  23.     // values() 将当前集合的所有values返回
  24.     System.out.println(map.values()); // [robot05, robot02]
  25.     // entrySet() 将当前集合的所有数据,以键值对的形式返回
  26.     System.out.println(map.entrySet()); // [Entry05=robot05, Entry02=robot02]
  27.    
  28.     // 两种遍历方式
  29.     // 1. 使用keySet()迭代器遍历HashMap
  30.     // 先使用keySet()返回HashMap的所有键,然后使用set集合的迭代器,遍历HashMap
  31.     Iterator<String> integer = map.keySet().iterator();
  32.     while(integer.hasNext()){
  33.         // 存储迭代器的键
  34.         String keyTmp = integer.next();
  35.         // 通过get()取出值
  36.         System.out.println(keyTmp + " : " + map.get(keyTmp));
  37.     }
  38.     // 2. 使用entrySet迭代器遍历HashMap
  39.     Iterator<Map.Entry<String, String>> entryIterator = map.entrySet().iterator();
  40.     while(entryIterator.hasNext()){
  41.         System.out.println(entryIterator.next());
  42.     }
  43. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

北冰洋以北

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表