数据结构(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)。

踏实 踏踏实实~
原文地址:https://www.cnblogs.com/mrzhang123/p/5365822.html