映射表

2023-11-11

集是一个集合,它可以快速地寻找现有的元素,但是要查看元素,就需要查看的元素的精确副本。这不是一种非常通用的查找方式。通常,我们知道某些键的信息,并想要查找与之相对应的元素。映射表(map)数据结构就是为此设计的。映射表用来存放键值对。如果提供了键就能查找到相应的值。例如,有一张关于员工信息的记录表,键为员工ID,值为Employee对象。

Java 类库为映射表提供了两种通用的实现:HashMap和TreeMap。这两个类都实现了Map接口。

散列映射表对键进行散列,树映射表用键的整体顺序对元素进行排序,并将其组织成为搜索树。散列或者比较函数只能用于键。与键关联的值不能用来散列或者比较。

应该选择散列映射表呢?还是树映射表呢?与集一样,散列稍微地快一些,如果不需要按照排列顺序访问,就最好使用散列。

下列代码为存储的员工信息建立了一个散列映射表:

Map<String, Employee> staff = new HashMap<String, Employee>();
Employee Harry = new Employee("Harry Hacker");
staff.put("987-98-9996");
每当往映射表中添加对象时,必须同时提供一个键。在这里键是一个字符串,对应的值是一个Employee对象。

想要检索一个对象,必须提供一个键。

String s = "987-98-9996";
e = staff.get(s);

如果在映射表中没有给定键对应的信息,那么get将会返回一个null。

键必须是唯一的。不能对同一个键存放两个值。如果对同一个键两次调用put方法,第二个值就会取代第一个值。实际上,put将返回用这个键参数存储的上一个值。

remove方法用于从映射表中删除给定键对应的元素。size方法用于返回映射表中的元素数。

集合框架并没有将映射表本身视为一个集合(其他的数据结构框架则将映射表视为对(pairs)或者视为用键作为索引值的集合)。然而,可以获得映射表的视图,这是一组实现Collection接口的对象,或者它的子接口视图。

有三个视图,他们分别是:键集、值集合(不是集)和键/值对集。键与键值对形成了一个集,这是因为在映射表中一个键只能有一个副本。下列的方法将返回这3个视图(条目集的元素是静态内部类Map.Entry的对象)。

Set<K> keySet()
Collection<K> values ()
Set <Map.Entry<K,V>> entrySet()
注意KeySet既不是HashSet,也不是TreeSet,而是实现了Set接口的某个其他类的对象。Set接口扩展了collection接口,因此可以与使用任何集合一样使用KeySet。

例如可以枚举映射表中的所有键:

Set<String> keys = map.keySet();
for(String key :keys)
{
   do something with the keys
}

提示:如果想要同时查看键与值,就可以枚举各个条目(entires)查看,以避免对值进行查找。 可以使用下面这段代码框架:

for(Map.Entry<String,Employee> entry:staff.entrySet())
{
      String key = entry.getKey();
      Employee value = entry.getValue();
      do something with the key,value 
}
如果调用迭代器的remove方法,实际上就从映射表中删除了键以及对应的值。但是不能将元素添加到键集的视图中。如果只添加键不添加值是毫无意义的,如果试图调用add方法,会抛出一个UnsupportedOperationException异常。条目集视图也有同样的限制,不过从概念上讲,添加新的键值对是有意义的。

下面的代码显示了映射表的整个操作过程。首先将键值对添加到映射表中,然后从映射表中删除一个键,同时与之对应的值也被删除了。接下来修改与某一个键对应的值,并调用get方法查看这个值。最后对条目集进行迭代。

import java.util.*;

/**
 * This program demonstrates the use of a map with key type String and value type Employee.
 * @version 1.10 2004-08-02
 * @author Cay Horstmann
 */
public class MapTest
{
   public static void main(String[] args)
   {
      Map<String, Employee> staff = new HashMap<String, Employee>();
      staff.put("144-25-5464", new Employee("Amy Lee"));
      staff.put("567-24-2546", new Employee("Harry Hacker"));
      staff.put("157-62-7935", new Employee("Gary Cooper"));
      staff.put("456-62-5527", new Employee("Francesca Cruz"));

      // print all entries

      System.out.println(staff);

      // remove an entry

      staff.remove("567-24-2546");

      // replace an entry

      staff.put("456-62-5527", new Employee("Francesca Miller"));

      // look up a value

      System.out.println(staff.get("157-62-7935"));

      // iterate through all entries

      for (Map.Entry<String, Employee> entry : staff.entrySet())
      {
         String key = entry.getKey();
         Employee value = entry.getValue();
         System.out.println("key=" + key + ", value=" + value);
      }
   }
}

/**
 * A minimalist employee class for testing purposes.
 */
class Employee
{
   /**
    * Constructs an employee with $0 salary.
    * @param n the employee name
    */
   public Employee(String n)
   {
      name = n;
      salary = 0;
   }

   public String toString()
   {
      return "[name=" + name + ", salary=" + salary + "]";
   }

   private String name;
   private double salary;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

映射表 的相关文章

  • 从字符串中删除重音符号

    最近我在 StringUtils 库中发现了非常有用的方法 即 StringUtils stripAccents String s 我发现它对于删除任何特殊字符并将其转换为某些 ASCII 等效字符 确实很有帮助 例如 c 等 现在我正在为
  • 使用按键重新排列字符串

    我想使用Pythonrandomly根据给定的键重新排列字符串的各个部分 我还想用相同的密钥恢复原始字符串 def rearrange key data pass def restore key rearranged data pass 效
  • 从字符串中删除多个子字符串 - Java

    我需要从给定字符串中删除多个子字符串 例子 String exclude one two three String input if we add one and two we get three 我希望我的程序从输入字符串中删除所有出现的
  • PHP 数字:小数点仅在需要时可见

    我想知道是否存在一些函数可以自动按十进制格式化数字 所以如果我有 所以我的答案是 如果我的数据库中有 DECIMAL 数据格式 仅当它
  • 如何在 PHP 中去除字符串中的所有空格? [复制]

    这个问题在这里已经有答案了 我怎么能够strip remove all spaces of a string in PHP 我有一个string like string this is my string 输出应该是 thisismystr
  • 分割文件名

    如何编写Python脚本来分割文件名 eg LN0001 07272010 3 dat 并将文件重命名为LN0001 JY 07272010 另外我如何放置 该文件 内容 中每一行的末尾每一行都是一条记录 fn LN0001 0727201
  • 判断第一个字母是否是元音序言

    我习惯了过程式编程语言 而且我在 prolog 上遇到了一些困难 缺乏在线资源也是一个遗憾 获取给定变量的第一个字符并检查它是否是元音的最 序言 方式是什么 我想 这样的东西就是我所追求的 这都是伪代码 但这是你解决问题的方法吗 isVow
  • 将括号子集映射到字符

    我正在尝试创建一个 Scala 方法 该方法将采用一个父括号组 表示为字符串 然后将每个括号子组映射到不同的字母 然后它应该将它们放入它返回的映射中 所以基本上我调用以下方法 如下所示 val s 2 x 3 6 val map mapPa
  • 在字符串内打印单引号

    我想输出 XYZ s ABC 我在Python IDLE中尝试了以下3条语句 第一条和第二条语句输出 a before 带打印功能的第三条语句不输出 before 作为 Python 新手 我想了解为什么 之前输出 在第 1 条和第 2 条
  • 你能用 Swift 计算一个字符串吗?

    我有一个变量 并且有一个以字符串形式存储在其中的函数 var x func myFunction y Int println y 有没有办法评估字符串并运行函数 No 没有等效的eval https developer mozilla or
  • 在大文件中查找重复字符串

    一个文件包含大量 例如100亿 字符串 您需要查找重复的字符串 您有 N 个可用系统 您将如何找到重复项 埃里克森的答案可能是提出这个问题的人所期望的 您可以将 N 台机器中的每台机器用作哈希表中的一个存储桶 对于每个字符串 按顺序说出字符
  • 为什么 C# 编译的正则表达式比等效的字符串方法更快?

    每次我必须对字符串执行简单的包含或替换操作 其中我正在搜索的术语是固定值 时 我发现如果我获取示例输入并对其进行一些分析 则使用编译的正则表达式是几乎 总是比使用 String 类中的等效方法更快 我尝试过比较多种方法 hs是要搜索的 干草
  • std::regex 转义正则表达式中使用的特殊字符

    我是字符串来创建一个std regex FILE 作为单元测试的一部分 检查一些打印文件名的异常输出 在 Windows 上失败并显示 regex error error escape 表达式包含无效的转义字符或尾随转义 因为 FILE 宏
  • 使用 Javascript 删除字符串的最后一个字符

    我有一个DIV与一些字符 如何在每次单击时删除文本中的最后一个字符DIV itself 删除第一个字符 div on click function this text function index text return text repl
  • JavaScript 中的字符串基元和字符串对象有什么区别?

    取自 字符串文字 用双引号或单引号表示 和字符串 从非构造函数上下文中的 String 调用返回 即 没有 使用 new 关键字 是原始字符串 自动 JavaScript 将基元转换为 String 对象 以便可以使用 原始字符串的字符串对
  • 使用带有可变参数字符串的函数

    我正在研究带有可变参数的函数 并决定创建一个函数来创建带有参数的向量 我的功能是创建一个int矢量工作 vector
  • 替换后正确的子串位置

    我有一个由用户提供的这样的函数 function replace function string return string replace smile g replace foo bar baz g text 1 我有这样的输入字符串 v
  • 给定一个字符串,如何删除所有重复的连续字母?

    如何从字符串中删除两个连续的字母 例如 a str hii thherre 应该成为 hi there 我尝试这样做 a str join sorted set a str key a str index 但是 我得到 hi ter 是的
  • JavaScript - 替换 html 字符串中的特定单词索引

    我在 JS 字符串操作方面面临着一项具有挑战性的任务 有一个 HTML 字符串 我需要在其中替换特定单词索引处的单词 单词索引是忽略 HTML 标签时单词的编号 例如 下面是 HTML 字符串 span style font family
  • Android并计算给定字体和字体大小的单行字符串的大小?

    是否有一种 API 方法可以计算以给定字体和字体大小显示在一行上的字符串的大小 即宽度和高度 Paint p new Paint p setTypeface TypeFace obj if custom font use TypeFace

随机推荐

  • 使用 MVC 架构构建 Flask CRUD 应用程序

    转自 Felipe Silveira 的 Build a Flask CRUD Application with MVC Architecture 翻译 如何用 Flask 的 Blueprint 实现一个 CRUD 的应用 我多年来一直在
  • 项目前端技术总结

    设计目标 在前端的设计阶段引入prototype prototype用于允许用户评估开发人员提案 并在实施之前尝试它们 它还有助于了解用户特定的要求 并且可能在开发商在产品设计期间可能没有考虑到这些要求 在数据处理之前需要用户填写表单或浏览
  • C#中的三种参数传递

    在 C 中 有三种向方法传递参数的方式 1 值参数 调用方法时 会为每个值参数创建一个新的存储位置 复制参数的实际值给函数的形参 按值传递 传递实参变量存储的内容 作用 传递信息 2 引用参数 引用参数是一个对变量的内存位置的引用 复制参数
  • 自己制作npy数据集,数据格式类似于mnist数据(16)---《深度学习》

    代码 import tensorflow as tf import numpy as np import os from PIL import Image dir home jobs Pictures test def getFileArr
  • GPT和GPT2

    https blog csdn net weixin 48185819 article details 106533850 https zhuanlan zhihu com p 174782647 https wmathor com ind
  • Flutter 隐藏组件的多种方法

    链接 https blog csdn net haha223545 article details 102796137
  • VUE 本地和内网(远程)访问配置

    本机电脑由于开启Hyper V 所以默认得到的内网是虚拟网卡的IP 所以需要特殊的方法来得到内网IP 一 package json 原代码 scripts dev webpack dev server inline progress con
  • java用Swing编写简单计算器

    先写个用来处理计算的类Calculate import java util public class Calculate public static Stack
  • 二叉堆

    二叉堆 在学习二叉堆之前 我们得理解堆是什么 定义 堆通常可以看作成一个树 它有任意节点的值都不大于 不小于 其子节点的值 二叉堆的意思就是 它有两个子节点 可分为最大堆和最小堆 最大堆 父节点的值总是大于或等于任何一个子节点的值 最小堆
  • Fourth season fifteenth episode,is Ross man enough to play rugby?

    Scene A beauty parlour Rachel is getting a manicure while Chandler yes Chandler is getting a petticure Does that scare y
  • org.springframework.beans.factory.BeanCreationExce

    org springframework beans factory BeanCreationException Error creating bean with name u Injection of resource methods fa
  • 代码审查总结

    近期所带项目 由于人员素养良莠不齐 写出的代码质量不一 为了保证项目质量 不得不正确代码一行行进行审查 同一时候 为了对代码审查有个更深的了解及借鉴其他同行实践成果 在网上搜集了不少项目知识 以下是对这些知识做出的整理 第1章前提 在 Wi
  • urllib库的使用

    个人简介 作者简介 大家好 我是W chuanqi 一个编程爱好者 个人主页 W chaunqi 支持我 点赞 收藏 留言 愿你我共勉 若身在泥潭 心也在泥潭 则满眼望去均是泥潭 若身在泥潭 而心系鲲鹏 则能见九万里天地 文章目录 urll
  • caffe源码学习中--src/caffe/solver.cpp

    include caffe solver factory hpp中的solverRegistry类和SolverRegisterer 类 brief A solver factory that allows one to register
  • Unity屏幕坐标(Input.mousePosition)转换UI坐标

    Unity屏幕坐标 Input mousePosition 转换UI坐标 1 屏幕坐标的起点位置 左下角为 0 0 点 右上角为 Screen width Screen height 2 UI坐标的起点位置 屏幕中心点 方法一 Vector
  • linux下svn服务器搭建及使用(包含图解)

    今天自己动手在linux搭建了svn服务器 把具体过程和一些自己的见解分享给大家 希望对大家有所帮助 客户端svn 大家见到的小乌龟 下载地址为 http tortoisesvn net downloads html 这里客户端的安装就不作
  • Lua使用指南

    目录 简介 环境配置 基本语法 变量 运算符 数据类型 字符串 table 表 函数 常用语句 if while 循环 repeat until for循环 简介 lua 是一种开源 轻量的脚本语言 其设计目的是嵌入应用程序中 为应用程序提
  • Android imageview设置背景图,src,background,foreground

    foreground src 和 background 属性区别 1 background指的是背景 foreground指的是前景 而src指的是内容 三者可以同时使用 2 src填入图片时 是按照图片大小直接填充 并不会进行拉伸 而使用
  • Ubuntu搭建PPTP和连接到PPTP

    Ubuntu16 04搭建PPTP服务 TP link端口映射 检测服务器是否支持MPPE模块 sudo modprobe ppp compress 18 echo MPPE is ok 如果输出 MPPE is ok 则说明服务器的lin
  • 映射表

    集是一个集合 它可以快速地寻找现有的元素 但是要查看元素 就需要查看的元素的精确副本 这不是一种非常通用的查找方式 通常 我们知道某些键的信息 并想要查找与之相对应的元素 映射表 map 数据结构就是为此设计的 映射表用来存放键值对 如果提