数据结构(Java)——Set和Map的应用

时间:2022-05-22 10:37:54

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

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 + "\t(" + 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)。