zoukankan      html  css  js  c++  java
  • 数据结构(Java)——Set和Map的应用

    感情里,总会有分分合合; 生命里,总会有来来去去。 学会: 浅喜欢,静静爱,深深思索,淡淡释怀。

    1.概述

     1.Set定义为一种无重复元素的集合概念。Set集合是对象的唯一集合,通常用于确定某个元素是否是集合的成员。
     2.Map集合是创建了关键字与值之间关系的集合。给定关键字,MAP集合提供了检索其值 的高效方式。MAP集合的关键字必须是唯一的。给定关键字Map集合提供了检索其值的高效方式。Map集合的关键字必须是唯一的,每个关键字只对应于一个值。然而这并不一定是一对一的映射关系,多个关键字可能映射到同一个对象。Map的关键字不一定是字符串,但多数情况下是字符串。Map集合的关键字和值可以是任意类型的对象。
    

    2.Set的应用举例

    blockedDomains.txt

    dontgothere.com
    ohno.org
    badstuff.com
    badstuff.org
    badstuff.net
    whatintheworld.com
    notinthislifetime.org
    letsnot.com
    eeewwwwww.com
    package ds.java.ch13;
    
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.util.Scanner;
    import java.util.TreeSet;
    
    /** 
     * @author LbZhang
     * @version 创建时间:2015年12月2日 上午11:12:47 
     * @description
     * 使用Set集合:域阻塞器
     * 在一个阻塞域列表中测试web站点域。这里使用一个简单的阻塞域列表,但当使用TreeSet时,
     * 对某个域的检测是用logN步,不是n步完成的。
     */
    public class DomainBlocker {
        private  TreeSet<String> blocksSet;
    
        /**
         * 构造域阻塞器
         * @throws FileNotFoundException
         */
        public DomainBlocker() throws FileNotFoundException{
            blocksSet = new TreeSet<String>();
    
            File inputFile = new File("blockedDomains.txt");
            Scanner scan = new Scanner(inputFile);
    
            while(scan.hasNext()){
                blocksSet.add(scan.nextLine());
            }
        }
    
        public boolean domainIsBlocked(String domain){
            return blocksSet.contains(domain);
    
        }
    
        /**
         * 用于测试的主函数
         * @param args
         * @throws FileNotFoundException 
         */
        public static void main(String[] args) throws FileNotFoundException {
            DomainBlocker dblock = new DomainBlocker();
            Scanner scan = new Scanner(System.in);
    
            String domain;
    
            do{
                System.out.print("Enter a domain (DONE to quit): ");
                domain = scan.nextLine();
    
                if (!domain.equalsIgnoreCase("DONE"))
                {
                    if (dblock.domainIsBlocked(domain))
                        System.out.println("That domain is blocked.");
                    else
                        System.out.println("That domain is fine.");
                }
    
            }while(!domain.equalsIgnoreCase("DONE"));
        }
    
    }
    

    3.Map的应用举例

    销售统计核算

    package ds.java.ch13;
    
    /**
     *产品实体类的构建
     */
    public class Product implements Comparable<Product> {
        private String productCode;
        private int sales;
    
        /**
         * 产品编号的设计
         * @param productCode
         */
        public Product(String productCode) {
            this.productCode = productCode;
            this.sales = 0;
        }
    
        /**
         * 返回产品编号
         * 
         * @return the product code
         */
        public String getProductCode() {
            return productCode;
        }
    
        /**
         * 增加产品的销量
         */
        public void incrementSales() {
            sales++;
        }
    
        /**
         * 对比产品编号是否相同
         * 
         * @param other
         *            the other product
         * @return an integer code result
         */
        public int compareTo(Product obj) {
            return productCode.compareTo(obj.getProductCode());
        }
    
        /**
         *返回产品销量的字符串
         * 
         * @return a string representation of the product
         */
        public String toString() {
            return productCode + "	(" + sales + ")";
        }
    }
    
    package ds.java.ch13;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.Scanner;
    import java.util.TreeMap;
    
    /**
     * 销售统计核算
     * @author MrLBZ
     *
     */
    public class ProductSales
    {
        /**
         * Processes product sales data and prints a summary sorted by
         * product code.
         */
        public static void main(String[] args) throws IOException
        {
            TreeMap<String, Product> sales = new TreeMap<String, Product>();
    
            Scanner scan = new Scanner(new File("salesData.txt"));
    
            String code;
            Product product;
            while (scan.hasNext())
            {
                code = scan.nextLine();
                product = sales.get(code);
                if (product == null)
                    sales.put(code, new Product(code));
                else
                    product.incrementSales();
            }
    
            System.out.println("Products sold this period:");
            for (Product prod : sales.values())
                System.out.println(prod);
        }
    }
    

    salesData.txt 部分数据展示

    OB311
    HR588
    DX555
    EW231
    TT232
    TJ991
    HR588
    TT232
    GB637
    BV693
    CB329

    补充参考:

    关于TreeMap和HashMap的比较
    HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。
    HashMap 非线程安全 TreeMap 非线程安全.

    HashMap:基于哈希表实现。使用HashMap要求添加的键类明确定义了hashCode()equals()[可以重写hashCode()和equals()],为了优化HashMap空间的使用,您可以调优初始容量和负载因子。 
    (1)HashMap(): 构建一个空的哈希映像 
    (2)HashMap(Map m): 构建一个哈希映像,并且添加映像m的所有映射 
    (3)HashMap(int initialCapacity): 构建一个拥有特定容量的空的哈希映像 
    (4)HashMap(int initialCapacity, float loadFactor): 构建一个拥有特定容量和加载因子的空的哈希映像 
    TreeMap:基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。 
    (1)TreeMap():构建一个空的映像树 
    (2)TreeMap(Map m): 构建一个映像树,并且添加映像m中所有元素 
    (3)TreeMap(Comparator c): 构建一个映像树,并且使用特定的比较器对关键字进行排序 
    (4)TreeMap(SortedMap s): 构建一个映像树,添加映像树s中所有映射,并且使用与有序映像s相同的比较器排序 

    两种常规Map性能
    HashMap:适用于在Map中插入、删除和定位元素。
    Treemap:适用于按自然顺序或自定义顺序遍历键(key)。

    踏实 踏踏实实~
  • 相关阅读:
    serial number
    python getopt
    python readline,seek
    linux scp
    jenkinsapi
    windows kill process
    python time
    python configparse
    解决某些.net不方便解决的问题,解决方法就是 DHTML
    (转)windows XP 系统服务“关闭”详细列表,释放N多内存,128也够用了!
  • 原文地址:https://www.cnblogs.com/mrzhang123/p/5365822.html
Copyright © 2011-2022 走看看