标准库中的集合与映射

九、常用集合 (Collections) Rust标准库提供了多种集合类型,包括向量(Vec<T>)、字符串(String)、哈希映射(HashMap<K,V>)和哈希集合(HashSet<T>)等。这些集合存储在堆上,支持动态大小调整。向量是最常用的动态数组,字符串处理UTF-8编码文本,哈希映射存储键值对,哈希集合保证元素唯一性。文章详细介绍了各种集合的创建、操作和性能特点,并提供了最佳实践建议,如预分配容量、正确使用迭代方式和Entry API等。最后通过一个单词统计案例展示了集合的实际应用,强调Rust集 阅读详情

关于Set接口

    Set接口不允许重复元的Collection。由接口SortedSet给出的一种
特殊类型的Set保证其中的各项处于有序的状态。因为一个Set IS-A Collection,所以用于访问继承
Collection的List的项的方法也对Set有效。

    由Set所要求的一些独特的操作是一些插入/删除/以及(有效地)执行
基本查找的能力。对于Set,add方法如果执行成功则返回true,否则返回false,因为被添加的项已经存在。
保持各项已有序的状态的Set的实现是TreeSet。TreeSet类的基本操作花费对数最坏时间。

    默认情况下,排序假设TreeSet中项实现Comparable接口。另一种排序
可以调用Comparator实例化TreeSet来确定。例如,我们可以创建一个忽略大小写的程序然后进行插入
操作。在下面的代码中,Set 的大小为1。

//@CaseInsensitiveCompare 忽略大小写的函数
  Set<String> s = new TreeSet<String>(new CaseInsensitiveCompare());
  s.add("Hello"); s.add("HELLO");
  system.out.println("The size is:" + s.size());

关于Map接口

    Map是一个接口,代表由关键字以及它们的值组成的一些项的集合。关键字
必须是唯一的,但是若干个关键字可以映射到一些相同的值。因此,值不必是唯一的。在SortedMap接口
中,映射中的关键字保持逻辑上的有序状态。SortedMap接口的一种实现是TreeMao类。Map的基本操作
包括isEmply/clean/size等方法,而且最重要的是包含下列方法:

//判断是否存在这样的key值
  boolean contains(KeyType key);
//查找对应的Key值来进行查找相应的内容值
  ValueType get(keyType key);
//添加对应的对象
  ValueType put(KeyType key, ValueType value);

    通过一个Map迭代要比Collection复杂,因为Map不提供迭代器,而是
提供3种方法,将Map对象的视图作为Collection对象返回。由于这些视图本身就是Collection,
因此它们可以被迭代。

  set<KeyType> keySet();
  Collection<Value>  values();
  set<Map.Entry<KeyType, valueType>> entrySet();

    方法keySet和values返回简单的集合(这些关键字不包含重复元,因此
以一个Set对象形式返回)。这里的entyySet方法是作为一些项而形成的Set对象被返回(由于关键字是唯一的,
应此不存在重复项)。每一项由被嵌套的接口Map.Entry表示。对于类型Map.Entry的对象,其现有
的方法包括关键字/关键字的值//一起改变关键字的值:

  keyType getKey();
  valueType getValue();
  valueType setValue(ValueType newValue);

TreeSet和TreeMap的实现

    Java要求TreeSet和TreeMap支持基本的add、remove和contains
操作以对数最坏的情况时间完成。因此,基本实现方法就是平衡二叉查找树。一般来说,我们并不适用
AVL树,而是经常使用一些自顶向下的红黑树。

利用标注库中的TreeMap和TreeSet写一个实例

    通过改变第一个字母, 单词wine可以变成dine,fine,line,mine,
nine,oine或vine。通过改变里三个字母可以变成wind,wing,wink,wins。假设我们有一本词典,
由89000个不同长度的单词。
    最直接的方法是使用Map对象,其中关键字是单词,而关键字的值
是用一字母替换得到的单词集合。

代码演示部分


import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

public class Mapping_words {
/*
 * 计算一个Map对象的函数, 该对象以一些单词作为关键字而已只在一个字母处不同的一列
 * 单词作为关键字的值。该函数对一个89000单词的词典运行75秒(非常慢的一个方法,暴力搜索)
 */
private static boolean oneCharOff(String word1, String word2){
  if(word1.length() != word2.length())  //判断长度是否相等,如果长度不想等就返回false
    return false;

  int diffs = 0;
  for(int i = 0; i < word1.length(); i++)
    if(word1.charAt(i) != word2.charAt(i))
      if(diffs++ > 1)   //必须有且仅有一个字母不相同, 如果有1个以上的字母不同那么久返回false
        return false;
  return diffs == 1;
}

/*
 * @key     首先会查找在m里面查找是否有对应key值的value集合
 * @value
 */
private static<keyType> void updata(Map<keyType, List<String>> m, keyType key, String value){
  List<String> lst = m.get(key);    //获取value集合
  //如果没有就添加
  if(lst == null){
    lst = new ArrayList<>();
    m.put(key, lst);
  }
  //不管有没有最后都要添加进去
  lst.add(value);
}

/*
 * 第一个算法:该算法的时间为75秒。采用的几乎是枚举。
 */
private static Map<String, List<String>> computeAdjacentWords_01(List<String> theWords){
  Map<String, List<String>> adjWords = new TreeMap<>();
  String[] words = new String[theWords.size()];
  theWords.toArray(words);
  for(int i = 0; i < words.length; i++)
    for(int j = i + 1; j < words.length; j++)
      if(oneCharOff(words[i], words[j])){
        updata(adjWords, words[i], words[j]);
        updata(adjWords, words[j], words[i]);
      }
  return adjWords;
}

/**
 * 首先我们知道, 一个不同长度的两个单词再怎么变换最终还是不一样, 所以使用了一个策略就是将长度不同的单词来进行划分区域
 * 划分之后就减小了不必要的试探
 * @param theWords  词典里面所有的单词
 * 运行时间缩减到了16秒
 */
private static Map<String, List<String>> computeAdjacentWords_02(List<String> theWords){
  Map<String, List<String>> adjWords = new TreeMap<>();
  Map<Integer, List<String>> wordsByLength = new TreeMap<>();   //按长度来进行分组的

  for(String w : theWords)
    updata(wordsByLength, w.length(), w);

  //对长度Map进行迭代
  for(List<String> groupsWords : wordsByLength.values()){
    String[] words = new String[groupsWords.size()];
    groupsWords.toArray(words);
    for(int i = 0; i < words.length; i++)
      for(int j = i + 1; j < words.length; j++)
        if(oneCharOff(words[i], words[j])){
          updata(adjWords, words[i], words[j]);
          updata(adjWords, words[j], words[i]);
        }
  }
  return adjWords;
}

/**
 * 这是一种最优化的算法, 使用一些附加的映射!和前面一样, 首先按长度进行一个划分, 然后分别对每组进行计算。
 * 这时,首先要找出像wine和nine这样的单词对, 他们除了第一个单词以外都是一样的。对于长度为4的每一个单词,
 * 一种做法是删除第一个字母, 留下一个三个字母的代表。这样就形成了一个Map,其中关键字为一种代表。
 * @param theWords
 * @return
 */
private static Map<String, List<String>> computeAdjacentWords_03(List<String> theWords){
  Map<String, List<String>> adjWords = new TreeMap<>();
  Map<Integer, List<String>> wordsByLength = new TreeMap<>();   //按长度来进行分组的
  for(String w : theWords)
    updata(wordsByLength, w.length(), w);

  for(Map.Entry<Integer, List<String>> entry : wordsByLength.entrySet()){
    //每个长度的集合
    List<String> groupsWords = entry.getValue();
    int groupNum = entry.getKey();

    for(int i = 0; i < groupNum; i++){
      Map<String, List<String>> repToWord = new TreeMap<>();

      for(String str : groupsWords){
        //每个rep为单词的代表
        String rep = str.substring(0, i) + str.substring(i + 1);
        updata(repToWord, rep, str);
      }

      for(List<String> wordClique : repToWord.values())
        if(wordClique.size() >= 2)
          for(String s1 : wordClique)
            for(String s2: wordClique)
              if(s1 != s2)
                updata(adjWords, s1, s2);
    }
  }
  return adjWords;
}

/**
 * 打印结果并且显示时间差
 * @param map
 */
public static void printHighChangeables(Map<String, List<String>> map){
  long start = System.currentTimeMillis();
  for(Map.Entry<String, List<String>> entry : map.entrySet()){
    List<String> words = entry.getValue();
    System.out.print(entry.getKey() + " (");
    System.out.println(words.size() + "):");
    for(String s : words)
      System.out.print(" " + s);
    System.out.println();

  }
  long end = System.currentTimeMillis();
  System.out.println(end - start);
}

public static void main(String[] args) {
  String[] words = {"wine", "wife", "wipe", "wire", "dine", "fine", "line",
      "mine", "nine", "pine", "vine"};
  List<String> list = new ArrayList<>();
  for (String string : words) {
    list.add(string);
  }
  Map<String, List<String>> theMap = computeAdjacentWords_01(list);
  printHighChangeables(theMap);
  System.out.println('\n' + "----------------------------");
  Map<String, List<String>> theMap2 = computeAdjacentWords_02(list);
  printHighChangeables(theMap2);
  System.out.println('\n' + "----------------------------");
  Map<String, List<String>> theMap3 = computeAdjacentWords_03(list);
  printHighChangeables(theMap3);
}
}
java集合与映射(牛) java集合与映射 java集合与映射 java集合与映射 java集合与映射 java集合与映射 立即下载

相关推荐

3 集合与映射

国防工业大学高数(一)课件。。。。。与国防工业大学出的书配套课件。

数据规范

数据规范一. 数据规范的含义二. 数据规范方法2.1 规则处理引擎2.1 标准代码库映射 一. 数据规范的含义 数据治理的处理对象是海量分布在各个系统中的数据,这些不同系统的数据往往存在一定的差异:数据代码标准、数据格式、数据标识都不一样,甚至可能存在错误的数据.这就需要建立一套标准化的体系,对这些存在差异的数据统一标准,符合行业的规范,使得在同样的指标下进行分析,保证数据分析结果的可靠性. 例如,对于数据库的属性值而言,可以建立唯一性规则、连续性规则以及空值规则等来对数据进行检验和约束:唯一性规则一般是指

木讷的鱼 5530

国际标准国际代码表(数据库)

ISO 3166-1国际标准国家映射码中,两位字母&三位字母映射表 文件类型:sql、json、csv、xls 数据量:252条 资源大小:20KB

集合与映射

集合与映射

weixin_56165759的博客 2236

单细胞转录组数据分析全流程:从原始数据到细胞注释

本文详细介绍了单细胞转录组数据分析的全流程,从原始数据读取、环境搭建、数据质控与标准化,到降维聚类、细胞类型注释,以及高级质控与多样本整合。重点阐述了如何利用Seurat等工具进行数据处理,并通过标志基因比对与自动注释方法完成细胞身份鉴定,为研究者提供了一套清晰、可操作的分析指南。

coffee的博客 551

基于大模型的恶性胸腔积液全周期预测与诊疗方案研究

本研究基于大模型技术构建了恶性胸腔积液全流程预测与诊疗体系,涵盖术前风险评估、术中方案优化、术后恢复预测及并发症预防。通过整合多源医疗数据,实现了手术风险概率预测(准确率80%)、并发症预警(AUC值0.85)及个性化康复方案制定,显著提升诊疗精准度。研究创新性地将Transformer架构与多模态数据融合,在100例临床验证中显示良好性能,但存在数据样本局限、模型可解释性不足等问题。未来将扩大多中心临床验证,优化算法可解释性,探索与基因检测等技术的结合应用,推动恶性胸腔积液的精准诊疗发展。

嵌入式毕设/课设资料清单(速查手册·文档模板·题库,持续更新)→ 见最新文章 1897

集合(Set)和映射(Map)

集合(Set)和映射(Map)是两种常见的数据结构,它们在计算机科学中有着广泛的应用。下面分别介绍它们的概念、特点以及常见操作。哈希表提供了快速的平均时间复杂度,特别适合于不需要有序性的场景。树结构则提供了稳定的 (O(\log n)) 时间复杂度,并且能够保持元素的有序状态。在实际应用中,选择哪种实现方式取决于具体需求,例如是否需要有序性、预期的操作频率以及对内存使用的考量等。许多现代编程语言的标准库会提供多种集合和映射的实现供开发者选择。if (!if (!

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 318

SAP公司间外协业务流程以及配置说明

SAP公司间外协业务流程以及配置说明

竹大的博客 7161

9.集合与映射

文章目录*集合**9.1Java集合框架**9.1.1集合接口与实现分离**9.1.2`Collection`接口**9.1.3迭代器**9.2集合框架中的接口**9.3具体集合**9.3.1链表**9.3.3散列集**9.3.4树集**9.3.5队列与双端队列**9.3.6优先队列(典型用法是任务调度)**9.4映射**9.4.1基本映射操作**9.4.2更新映射条目**9.4.3映射视图**9.4.4弱散列映射(使用弱引用保存键)**9.4.5链接散列集与映射(记住插入元素项的顺序)**9.4.6枚举集

EdSheeran的博客 962

手把手教你学Simulink--基于故障诊断与容错控制的场景实例:电动汽车电机驱动系统的故障检测与隔离

本文介绍了基于Simulink的电动汽车电机驱动系统故障诊断与隔离(FDI)仿真建模方法。通过构建永磁同步电机(PMSM)驱动系统模型,实现了IGBT开路、电流传感器漂移等典型故障的注入与检测。重点阐述了基于观测器的残差生成方法,以及利用Stateflow实现的故障隔离逻辑。仿真结果表明,该系统能在85ms内准确识别故障类型,隔离准确率达97%,并支持容错控制。文章还探讨了AI故障预测、数字孪生等高级应用方向,为电动汽车电驱系统安全提供了完整的仿真解决方案。

MHD0815的博客 961

036、算子映射:如何将ONNX算子映射到NPU硬件指令?

《算子映射:ONNX到NPU的转换艺术》 本文深入探讨了将ONNX算子映射到NPU硬件指令的技术挑战与实践经验。作者通过真实案例揭示了映射过程中的常见陷阱,如Reshape算子被错误映射导致分类错误。文章详细分析了三种映射策略(直接映射、拆分映射和融合映射),并强调映射表在编译器中的核心作用。特别针对动态形状、精度对齐等难题提供了解决方案,分享了编写映射表时的实用铁律,包括先优化后映射、严格单元测试等。最后指出,成功的算子映射需要在数学语义、硬件约束和性能优化之间找到精确平衡,这种看似枯燥的工作实则决定着N

m0_50546716的博客 184

集合论知识总结——映射

定理3 设f:X→Y,g:Y→Z,若f和g都是可逆的,则gf也是可逆的且(gf)-1=f-1g-1,(f–1)-1=f。若|S|=n,则S上的置换称为n次置换。:设f:X→Y,A⊆X,由f和A可以唯一的确定Y 中的一个子集,记为f(A),f(A)={f(x)|x。A,h(x)=g(f(x)),则称h为映射f与g的合成。1.限制与扩张:设f:X→Y,A⊆X,当把f的定义域限制在A上时,就得到了一个j:A→Y,"x。(2)若存在一个映射h:Y→X,使得fh=IY,则称f是右可逆的,而h称为f的右逆映射。

m0_62249876的博客 8646

RK3568平台开发系列讲解(安卓篇)LED呼吸灯系统流程

1.app层封装后使用NotificationManager发出:NotificationManager.notify() 2.Android 系统架构中:一个manager类对应一个aidl接口,一个manager对应一个底层的服务,notification也是这个架构

内核笔记 3645

Java学数据结构(3)——树Tree & B树 & 红黑树 & Java标准库中的集合Set与映射Map & 使用多个映射Map的案例

1.B树,阶M,数据树叶上,根的儿子数在2和M之间,除根外,非树叶节点儿子为M/2和M之间; 2.B树的插入引起分裂,B树的删除,引起合并和领养; 3.红黑树,根是黑的,红色节点的儿子必须是黑的,所有路径的黑色节点数相同; 4.红黑树的插入,颜色翻转,单旋转,插入节点定颜色; 5.java标准库的set和map,使用红黑树;

Arya的博客,专注后端领域 975

YOLOv12涨点优化:自研检测头 | 独家创新(Partial_C_v12Detect)检测头结构创新,实现涨点

现有12Detect进行二次创新,提升检测精度,独家创新(Partial_C_12Detect)检测头结构创新,适合科研创新度十足,强烈推荐

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 629

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Rust从入门到暴走(14)--- Rust的常见集合

Rust 标准库中包含了一系列非常有用的数据结构,被称为集合(collections)。相较于其他数据类型只能代表单个值,集合可以容纳多个值。不同于内建的数组和元组类型,集合中的数据储存在堆上,这意味着在编译时不必知道数据的数量,而且数据量可以在程序运行时动态增加或减少。每种集合都有着不同的功能和成本,根据当前情况选择合适的集合类型是一项需要逐渐掌握的技能。

Luca的博客, 网络安全Hacker,人工智能AIer,区块链Web3er,全栈软件开发er 492

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Java学数据结构(3)——树Tree &amp; B树 &amp; 红黑树 &amp; Java标准库中的集合Set与映射Map &amp; 使用多个映射Map的案例_java 红黑树 库

在磁盘上,典型的查找树执行如下:设想要访问佛罗里达州公民的驾驶记录。假设有1千万项,每一个关键字是32字节(代表一个名字),而一个记录是256个字节。假设这些数据不能都装人主存,而我们是正在使用系统的20个用户中的一个(因此有1/20的资源)。这样,在1秒内,我们可以执行2500万次指令,或者执行6次磁盘访问。不平衡的二叉查找树是一个灾难。在最坏情形下它具有线性的深度,从而可能需要1千万次磁盘访问。

2501_90212820的博客 822

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

第7章 集合类

第7章 集合类 在 Java 类库中有一套相当完整的容器集合类来持有对象。Kotlin没有去重复造轮子(Scala则是自己实现了一套集合类框架),而是在Java 类库的基础上进行了改造和扩展,引入了不可变集合类,同时扩展了大量方便实用的功能,这些功能的API 都在 kotlin.collections 包下面。 另外,在Kotlin中集合类不仅仅能持有普通...

AI天才研究院 8608

C++标准库及其相关函数

C++标准库 ·Standard Template Library(STL) ·标准版模板库STL包含常用算法和数据结构的通用库 ·STL的核心内容是3个基本组件: ·容器 ·算法 ·迭代器 容器 ·向量vector ·线性表list ·队列queue ·映射map ·集合set ·字符串string 常用算法 排序 sort() 查找 find() 替换 replace() 合并 merge() 反序 reverse() 统计 count() 迭代器 iterator 一、向量vector ·向量是一个

m2426675454的博客 1300

瓜皮学Python之字典和集合

下面是Python词汇表中节略的对可哈希对象的定义。一个对象可哈希的意思是在其生命周期内哈希码都不发生改变(使用__hash__()方法),并可与其它对象进行比较(使用__eq__()方法)。相等的可哈希对象必须要有一致的哈希码。数据类型和普通的不可变类型str及bytes都是可哈希对象。容器类型在不可变及的所含对象也均不可变时是可哈希的。frozenset一定是可哈希的,因为其所含的每个元素在定义上都必须是可哈希的。tuple仅在所有元素都可哈希时才可哈希。参见元组tt、tl和tfid()类继承的。...

npm_run_dev__的博客 381

【PL理论】(11) F#:标准库之 Set | 标准库之 Map

本章我们将简要的介绍一下 Set 和 Map (非常简要,简要至极)

有道无术, 术尚可求。有术无道, 止于术。 2935

C++的标准容器及其应用

介绍C++常用的容器

IT_Beijing_BIT的博客 1406

集合映射为ID

1 typedef set<int> Set; 2 map<Set,int> IDcache; 3 vector<Set> Setcache; 4 5 int ID(Set x) 6 { 7 if(IDcache.count(x)) return IDcache[x]; 8 Setcache.push...

weixin_30547797的博客 114

C 标准库 - <ctype.h>

C 标准库的头文件提供了一些函数,可用于测试和映射字符。这些函数接受作为参数,它的值必须是 EOF 或表示为一个无符号字符。如果参数 c 满足描述的条件,则这些函数返回非零(true)。如果参数 c 不满足描述的条件,则这些函数返回零。

m0_73509997的博客 161
上一篇: 散列冲突
下一篇: 数据结构猜字谜游戏(Java语言编写)
LuFei_java
博客等级 码龄10年 1粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值