java程序:set改造成map

简介:

逻辑:

      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); 
  } 
}

 

 本文转自二郎三郎博客园博客,原文链接:http://www.cnblogs.com/haore147/p/4214803.html,如需转载请自行联系原作者

相关文章
|
2月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
233 1
|
4月前
|
人工智能 监控 安全
智慧工地解决方案,java智慧工地程序代码
智慧工地系统融合物联网、AI、大数据等技术,实现对施工现场“人、机、料、法、环”的全面智能监控与管理,提升安全、效率与决策水平。
152 2
|
2月前
|
安全 Java
Java异常处理:程序世界的“交通规则
Java异常处理:程序世界的“交通规则
340 98
|
5月前
|
存储 缓存 JavaScript
Set和Map有什么区别?
Set和Map有什么区别?
465 1
|
2月前
|
存储 算法 容器
set_map的实现+set/map加持秒杀高频算法题锻炼算法思维
`set`基于红黑树实现,支持有序存储、自动去重,增删查效率为O(logN)。通过仿函数可自定义排序规则,配合空间配置器灵活管理内存。不支持修改元素值,迭代器失效需注意。`multiset`允许重复元素。常用于去重、排序及查找场景。
|
6月前
|
存储 JavaScript 前端开发
for...of循环在遍历Set和Map时的注意事项有哪些?
for...of循环在遍历Set和Map时的注意事项有哪些?
343 121
|
9月前
|
编译器 C++ 容器
【c++丨STL】基于红黑树模拟实现set和map(附源码)
本文基于红黑树的实现,模拟了STL中的`set`和`map`容器。通过封装同一棵红黑树并进行适配修改,实现了两种容器的功能。主要步骤包括:1) 修改红黑树节点结构以支持不同数据类型;2) 使用仿函数适配键值比较逻辑;3) 实现双向迭代器支持遍历操作;4) 封装`insert`、`find`等接口,并为`map`实现`operator[]`。最终,通过测试代码验证了功能的正确性。此实现减少了代码冗余,展示了模板与仿函数的强大灵活性。
277 2
|
3月前
|
存储 Java 编译器
对比Java学习Go——程序结构与变量
本节对比了Java与Go语言的基础结构,包括“Hello, World!”程序、代码组织方式、入口函数定义、基本数据类型及变量声明方式。Java强调严格的面向对象结构,所有代码需置于类中,入口方法需严格符合`public static void main(String[] args)`格式;而Go语言结构更简洁,使用包和函数组织代码,入口函数为`func main()`。两种语言在变量声明、常量定义、类型系统等方面也存在显著差异,体现了各自的设计哲学。