逻辑:

      set是无序不重复数据元素的集合。

      map是另一种set,如果将<key,value>看成一个整体的话,其实就是set。在map中,若用map的keyset()方法将key提取出来,便构成了一个set集合。

      所以,就定义一个整体SimpleEntry<K,V>作为元素存入set。

代码:

/*

*SimpleEntry<K,V>作为map对象的存储元素

*/

class SimpleEntry<K, V>
  implements Map.Entry<K, V>, Serializable
{

// map中的key不可变
  private final K key;
  private V value;

  public SimpleEntry(K paramK, V paramV)
  {
    this.key = paramK;
    this.value = paramV;
  }

 

public SimpleEntry(Map.Entry<? extends K, ? extends V> paramEntry)
  {
    this.key = paramEntry.getKey();
    this.value = paramEntry.getValue();
  }

  public K getKey()
  {
    return this.key;
  }

  public V getValue()
  {
    return this.value;
  }

  public V setValue(V paramV)
  {
    Object localObject = this.value;
    this.value = paramV;
    return localObject;
  }

  public boolean equals(Object paramObject)
  {
    if (paramObject == this)
    {
      return true;
    }
    if (paramObject.getClass() == SimpleEntry.class)
    {
      SimpleEntry localSimpleEntry = (SimpleEntry)paramObject;
      return localSimpleEntry.getKey().equals(getKey());
    }
    return false;
  }

  public int hashCode()
  {
    return this.key == null ? 0 : this.key.hashCode();
  }

  public String toString()
  {
    return this.key + "=" + this.value;
  }
}

 

/*

*Set2Map<K, V>继承自hashset,底层是利用hashset来存储,但存储的是<K,V>这样的二元组,所以可以看成是一个map

*/

public class Set2Map<K, V> extends HashSet<SimpleEntry<K, V>>
{
  public void clear()
  {
    super.clear();
  }

  public boolean containsKey(K paramK)
  {
    return super.contains(new SimpleEntry(paramK, null));
  }

  boolean containsValue(Object paramObject)
  {
    for (SimpleEntry localSimpleEntry : this)
    {
      if (localSimpleEntry.getValue().equals(paramObject))
      {
        return true;
      }
    }
    return false;
  }

  public V get(Object paramObject)
  {
    for (SimpleEntry localSimpleEntry : this)
    {
      if (localSimpleEntry.getKey().equals(paramObject))
      {
        return localSimpleEntry.getValue();
      }
    }
    return null;
  }

  public V put(K paramK, V paramV)
  {
    add(new SimpleEntry(paramK, paramV));
    return paramV;
  }

 

//内部用了迭代器实现

  public void putAll(Map<? extends K, ? extends V> paramMap)
  {
    for (Iterator localIterator = paramMap.keySet().iterator(); localIterator.hasNext(); ) { Object localObject = localIterator.next();

      add(new SimpleEntry(localObject, paramMap.get(localObject)));
    }
  }

//内部用了迭代器实现

  public V removeEntry(Object paramObject)
  {
    Iterator localIterator = iterator();
    while (localIterator.hasNext())
    {
      SimpleEntry localSimpleEntry = (SimpleEntry)localIterator.next();
      if (localSimpleEntry.getKey().equals(paramObject))
      {
        Object localObject = localSimpleEntry.getValue();
        localIterator.remove();
        return localObject;
      }
    }
    return null;
  }

  public int size()
  {
    return super.size();
  }
}

 

测试程序:

public class Set2MapTest
{
  public static void main(String[] paramArrayOfString)
  {
    Set2Map localSet2Map = new Set2Map();

    localSet2Map.put("语文", Integer.valueOf(89));
    localSet2Map.put("数学", Integer.valueOf(83));
    localSet2Map.put("英文", Integer.valueOf(80));
    System.out.println(localSet2Map);

    System.out.println(localSet2Map.size());
    localSet2Map.removeEntry("数学");
    System.out.println("删除key为\"数学\"的Entry之后:" + localSet2Map);

    System.out.println("语文成绩:" + localSet2Map.get("语文"));

    System.out.println("是否包含\"英文\"key :" + localSet2Map.containsKey("英文"));

    System.out.println("是否包含 82 value :" + localSet2Map.containsValue(Integer.valueOf(82)));

    localSet2Map.clear();
    System.out.println("执行clear()方法之后的集合:" + localSet2Map);
  }
}

 

 

 

 

 

 

 

 

 

reference:

       1. 《疯狂java,突破程序员基本功的16课》 李刚。

java程序:set改造成map的更多相关文章

  1. 分享非常有用的Java程序 (关键代码)(五)---把 Array 转换成 Map

    原文:分享非常有用的Java程序 (关键代码)(五)---把 Array 转换成 Map import java.util.Map; import org.apache.commons.lang.Ar ...

  2. Java程序员岗位

    Java程序员岗位面试题有哪些?   1.面向对象的特征有哪些方面(1)抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择 ...

  3. Java程序员面试题集(116-135)

    摘要:这一部分讲解基于Java的Web开发相关面试题,即便在Java走向没落的当下,基于Java的Web开发因为拥有非常成熟的解决方案,仍然被广泛应用.不管你的Web开发中是否使用框架,JSP和Ser ...

  4. JAVA基础--容器 Set, List, Map

    Colections接口, Iterator接口, Set接口, List接口, Comparable接口, Map接口 Collections类 容器:装各种对象. 所有容器都在java.util里 ...

  5. 使用linux perf工具生成java程序火焰图

    pre.cjk { font-family: "Nimbus Mono L", monospace } p { margin-bottom: 0.1in; line-height: ...

  6. Efficient&Elegant:Java程序员入门Cpp

    最近项目急需C++ 的知识结构,虽说我有过快速学习很多新语言的经验,但对于C++ 老特工我还需保持敬畏(内容太多),本文会从一个Java程序员的角度,制定高效学习路线快速入门C++ . Java是为了 ...

  7. JAVA程序员面试宝典

    程序员面试之葵花宝典 面向对象的特征有哪些方面    1. 抽象:抽象就是忽略一个主题中与当前目标2. 无关的那些方面,3. 以便更充分地注意与当前目标4. 有关的方面.抽象并不5. 打算了解全部问题 ...

  8. spark之java程序开发

    spark之java程序开发 1.Spark中的Java开发的缘由: Spark自身是使用Scala程序开发的,Scala语言是同时具备函数式编程和指令式编程的一种混血语言,而Spark源码是基于Sc ...

  9. 聊聊阿里社招面试,谈谈“野生”Java程序员学习的道路

    引言 很尴尬的是,这个类型的文章其实之前笔者就写过,原文章里,笔者自称LZ(也就是楼主,有人说是老子的简写,笔者只想说,这位同学你站出来,保证不打死你,-_-),原文章名称叫做<回答阿里社招面试 ...

  10. 编写高质量代码:改善Java程序的151个建议 --[78~92]

    编写高质量代码:改善Java程序的151个建议 --[78~92] HashMap中的hashCode应避免冲突 多线程使用Vector或HashTable Vector是ArrayList的多线程版 ...

随机推荐

  1. 虚拟机如何访问tomcat

    首先需要把tomcat和jdk整到虚拟机里,然后再在虚拟机里安装tomcat和jdk. 一.怎样把tomcat和jdk整到虚拟机里? 1,需要“ha_Serv-U6406 ftp服务器”的帮助,所以先 ...

  2. 《REWORK》启示录 招聘笔杆子——程序员为什么值得写博客

    Hire Great Writers 仿佛这是写给自己看的,不过这在其中也有着相当有趣的意义 .虽然自己算是一个能写的人,或许这算是一种不算才华的才华,写博文的意义通常不会在于去描述自己怎样,怎样.通 ...

  3. html_entity_decode() 函数

    html_entity_decode() 函数   定义和用法 The html_entity_decode() function converts HTML entities to characte ...

  4. 阿里大于验证码发送 (ThinkPhp框架)

    1.登录平台 阿里大于2.登陆之后我们可以看到资费,使用场景等,在进入正题之前我们需要一些准备工作,首先我们先了解下短信的请求参数,在这里我们需要注意的是sms_param这个参数,在接下来我们申请短 ...

  5. Quartz Quick Start Guide

    Welcome to the QuickStart guide for Quartz. As you read this guide, expect to see details of: Downlo ...

  6. app包中的fragment和v4包中的fragment的使用的区别

    app包中的fragment和v4包中的fragment的使用的区别 1.尽量不要用app包中的fragment,因为这个是在3.0之后才有的,支持的版本太高,在低版本中是是用不了的 2.androi ...

  7. ASP.net MVC 多语言处理

    MVC多语言处理主要分两部分,一部分是Razor视图中的文字标签内容切换, 另一部分是javascript文件中的文标签内容切换.  这里分这两部分来说. View视图中的比较好做, 思路是使用资源文 ...

  8. C# 面向对象编程的继承性-多继承

    多继承 如果要使用多继承,需要使用接口,因为C#中的类只支持单继承,而接口支持多继承,实现多继承时,继承的多个接口中间用逗号(,)隔开. 说明: 实现多继承时,继承的可以是多个接口,也可以是一个类及多 ...

  9. java.lang.reflection打印一个类的全部信息

    package com.ljy.chapter5; import java.lang.reflect.Constructor; import java.lang.reflect.Field; impo ...

  10. Cocos Studio1.5.0.1开发学习笔记(一)

    听说Cocos Studio很久了,主要是因为骨骼动画.目前看来Cocos2d-x播放动画的方式只有2种: 第一种:是播放序列帧动画,即将动画的每一帧都加载进缓存里,需要播放时再使用Animation ...