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

相关文章
|
5天前
|
存储 算法 Java
Java Set深度解析:为何它能成为“无重复”的代名词?
Java的集合框架中,Set接口以其“无重复”特性著称。本文解析了Set的实现原理,包括HashSet和TreeSet的不同数据结构和算法,以及如何通过示例代码实现最佳实践。选择合适的Set实现类和正确实现自定义对象的hashCode()和equals()方法是关键。
18 4
|
5天前
|
Java
那些与Java Set擦肩而过的重复元素,都经历了什么?
在Java的世界里,Set如同一位浪漫而坚定的恋人,只对独一无二的元素情有独钟。重复元素虽屡遭拒绝,但通过反思和成长,最终变得独特,赢得了Set的认可。示例代码展示了这一过程,揭示了成长与独特性的浪漫故事。
13 4
|
5天前
|
Java 开发者
Java Set:当“重复”遇见它,秒变“独宠”!
在Java编程中,Set接口确保集合中的元素不重复,每个元素都是独一无二的“独宠”。本文介绍了Set的两种常见实现:HashSet和TreeSet。HashSet基于哈希表实现,提供高效的添加、删除和查找操作;TreeSet基于红黑树实现,不仅去重还能对元素进行排序。通过示例代码,展示了这两种集合的具体应用,帮助开发者更好地理解和使用Set。
13 4
|
11天前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
11天前
|
存储 Java 开发者
Java 中 Set 类型的使用方法
【10月更文挑战第30天】Java中的`Set`类型提供了丰富的操作方法来处理不重复的元素集合,开发者可以根据具体的需求选择合适的`Set`实现类,并灵活运用各种方法来实现对集合的操作和处理。
|
10天前
|
存储 Java 开发者
Java Set:无序之美,不重复之魅!
在Java的集合框架中,Set接口以其“无序之美”和“不重复之魅”受到开发者青睐。Set不包含重复元素,不保证元素顺序,通过元素的hashCode()和equals()方法实现唯一性。示例代码展示了如何使用HashSet添加和遍历元素,体现了Set的高效性和简洁性。
22 4
|
10天前
|
存储 算法 Java
为什么Java Set如此“挑剔”,连重复元素都容不下?
在Java的集合框架中,Set是一个独特的接口,它严格要求元素不重复,适用于需要唯一性约束的场景。Set通过内部数据结构(如哈希表或红黑树)和算法(如哈希值和equals()方法)实现这一特性,自动过滤重复元素,简化处理逻辑。示例代码展示了Set如何自动忽略重复元素。
18 1
|
10天前
|
存储 算法 Java
Java中的Set,你真的了解它的“无重复”奥秘吗?
在Java的广阔天地里,Set以其独特的“无重复”特性,在众多数据结构中脱颖而出。本文将揭秘Set的“无重复”奥秘,带你领略其魅力。Set通过哈希算法和equals()方法协同工作,确保元素不重复。通过一个简单的案例,我们将展示HashSet如何实现这一特性。
21 1
|
11天前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
11天前
|
Java 开发者