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,如需转载请自行联系原作者

相关文章
|
3月前
|
存储 算法 容器
set_map的实现+set/map加持秒杀高频算法题锻炼算法思维
`set`基于红黑树实现,支持有序存储、自动去重,增删查效率为O(logN)。通过仿函数可自定义排序规则,配合空间配置器灵活管理内存。不支持修改元素值,迭代器失效需注意。`multiset`允许重复元素。常用于去重、排序及查找场景。
|
3月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
254 1
|
3月前
|
安全 Java
Java异常处理:程序世界的“交通规则
Java异常处理:程序世界的“交通规则
343 98
|
4月前
|
存储 Java 编译器
对比Java学习Go——程序结构与变量
本节对比了Java与Go语言的基础结构,包括“Hello, World!”程序、代码组织方式、入口函数定义、基本数据类型及变量声明方式。Java强调严格的面向对象结构,所有代码需置于类中,入口方法需严格符合`public static void main(String[] args)`格式;而Go语言结构更简洁,使用包和函数组织代码,入口函数为`func main()`。两种语言在变量声明、常量定义、类型系统等方面也存在显著差异,体现了各自的设计哲学。
|
5月前
|
人工智能 监控 安全
智慧工地解决方案,java智慧工地程序代码
智慧工地系统融合物联网、AI、大数据等技术,实现对施工现场“人、机、料、法、环”的全面智能监控与管理,提升安全、效率与决策水平。
157 2
|
6月前
|
存储 缓存 JavaScript
Set和Map有什么区别?
Set和Map有什么区别?
471 1
|
7月前
|
存储 JavaScript 前端开发
for...of循环在遍历Set和Map时的注意事项有哪些?
for...of循环在遍历Set和Map时的注意事项有哪些?
345 121
|
7月前
|
存储 C++ 容器
unordered_set、unordered_multiset、unordered_map、unordered_multimap的介绍及使用
unordered_set是不按特定顺序存储键值的关联式容器,其允许通过键值快速的索引到对应的元素。在unordered_set中,元素的值同时也是唯一地标识它的key。在内部,unordered_set中的元素没有按照任何特定的顺序排序,为了能在常数范围内找到指定的key,unordered_set将相同哈希值的键值放在相同的桶中。unordered_set容器通过key访问单个元素要比set快,但它通常在遍历元素子集的范围迭代方面效率较低。它的迭代器至少是前向迭代器。前向迭代器的特性。
309 0