百分点笔试题-写一个哈希表的遍历的算法

原创 2013年12月02日 10:03:22

Map.Entry使用解读及其在哈希表的遍历中的应用

       在北京百分点科技笔试的时候,有一道算法设计题目:写一个算法,遍历哈希表,并输出相应的key,value值。当时答的不是很好,事后上网查了下资料,整理成下篇文章,供以后参考学习。

一、Map.Entry使用解读

1.Map.Entry说明

Map是java中的接口,而Map.Entry是Map的一个内部接口。

Map提供了一些常用方法,如keySet()、entrySet()等方法,keySet()方法返回值是Map中key值的集合;entrySet()的返回值也是返回一个Set集合(键值对集合),此集合的类型为Map.Entry。Map.Entry是Map声明的一个内部接口,此接口为泛型,定义为Entry<K,V>。它表示Map中的一个实体(一个key-value对)。接口中有getKey(),getValue方法。

2.Map.Entry使用

你是否已经对每次从Map中取得关键字然后再取得相应的值感觉厌倦?使用Map.Entry类,你可以得到在同一时间得到所有的信息。

标准的Map访问方法如下: 

Map map = new HashMap(); 
Set keys = map.keySet( );//keySet返回的是Map中key的集合
if(keys != null) {
	Iterator iterator = keys.iterator( );
	while(iterator.hasNext( )) {
		Object key = iterator.next( );
		Object value = map.get(key);
		;....
	;}
}

        然而,这个方法有一个问题:从Map中取得关键字之后,我们必须每次重复返回到Map中取得相对的值,这是很繁琐和费时的

       幸运的是,这里还有一个更加简单的途径。Map类提供了一个称为entrySet()的方法,这个方法返回一个Map.Entry实例化后的对象集。接着,Map.Entry类提供了一个getKey()方法和一个getValue()方法,因此,上面的代码可以被组织得更符合逻辑。举例如下:

Map map = new HashMap(); 
Set entries = map.entrySet( );
if(entries != null) {
	Iterator iterator = entries.iterator( );
	while(iterator.hasNext( )) {
		Map.Entry entry =iterator.next( );
		Object key = entry.getKey( );
		Object value = entry.getValue();
		;....
	}
}

   或者:

Map map = new HashMap(); 
Iterator iter = map.entrySet().iterator(); 
while (iter.hasNext()) { 
    Map.Entry entry = (Map.Entry) iter.next(); 
    Object key = entry.getKey(); 
    Object val = entry.getValue(); 
} 

   效率高,以后一定要使用此类型的遍历哈希表的方式!尽管增加了一行代码,我们却省略了许多对Map不必要的“get”调用。同时,提供给开发人员一个同时保持了关键字和其对应的值的类。Map.Entry同时也提供了一个setValue()方法,程序员可以使用它修改map里面的值。

二、Map.Entry在哈希表的遍历中的应用 

import java.util.Enumeration;  
import java.util.HashMap;  
import java.util.Hashtable;  
import java.util.Iterator;  
import java.util.Map;  
import java.util.Set;  
public class HashMapTable {  
    public static void main(String[] args) {  
        Map map = new HashMap();  
        Hashtable table = new Hashtable();  
  
        map.put("map_key_1", "value_1");  
        map.put( "map_key_2", null);  
  
          
        table.put("table_key_1", "table_value_1");  
        table.put("table_key_2", "table_value_2");  
        //table.put("table_key_3", null); /**table中允许有null( key和value中任一)*/  
  
        Set map_ety = map.entrySet();  
        //HashMap 和Hashtable 中元素在遍历的时候是后进先出,栈的结构  
        for(Iterator iter = map_ety.iterator(); iter.hasNext(); ){  
            Map.Entry ety = (Map.Entry)iter.next();  
            System.out.println(ety.getKey() + "====" + ety.getValue());  
        }  
        for( Enumeration e = table.keys(); e.hasMoreElements(); ){  
            String key = (String)e.nextElement();  
            System.out.println( key + "=====" + table.get(key));  
        }  
    }  
}  
运行结果:

map_key_2====null
 
map_key_1====value_1
 
table_key_2=====table_value_2
 
table_key_1=====table_value_1

hash表的一些基本知识

问题引入: 我们在网站上注册账号时,当填好用户名后,系统都会判断用户名是否已被使用,如果已被使用,系统就会提示该用户名已被注册。充满好奇心的小明想知道系统是如何检测用户名是否被使用的。他能想到的最简单...

java 哈希表的几种遍历

package cn.org.yopcrm; import java.util.HashMap; import java.util.Iterator; import java.util.Map; i...

遍历Hashtable的几种方法

直接上代码,代码中使用四种方法遍历Hashtable。 using System; using System.Collections; namespace HashtableExample { ...
  • tiana0
  • tiana0
  • 2015年04月04日 20:04
  • 4285

[Codevs 1230]元素查找(手写哈希表)

题目连接:http://codevs.cn/problem/1230/ 说白了就是要我们自己手写一个哈希表的数据结构来实现添加和查找功能,map也能直接过(我第一次写就是用map骗AC的) ...
  • qpswwww
  • qpswwww
  • 2014年10月16日 22:09
  • 1105

js hash 遍历

var check_hash = { "long":"0", "byte[]":"1", "bool":...

改进hash遍历

STL中实现的hash_map和MFC中实现的CMap数据结构均为hash。普通的hash在遍历时,效率会比较慢。hash_map与CMap的遍历均顺序访问每一个桶,因此会在空桶上浪费一定的时间。 1...

遍历HashMap的四种方法

public static void main(String[] args) { Map map = new HashMap(); map.put("1", "value1"); ma...

python两种遍历字典(dict)的方法比较

python以其优美的语法和方便的内置数据结构,赢得了不少程序员的亲睐。 其中有个很有用的数据结构,就是字典(dict),使用非常简单。说到遍历一个dict结构,我想大多数人都会想到 for key...

基于MATLAB的Cholesky分解法解线性方程组

定理: 若A∈Rn∗n对称正定,则存在一个对角元为正数的下三角矩阵L∈Rn∗n,使得A=LLT成立. A\in {R}^{n*n}对称正定,则存在一个对角元为正数的下三角矩阵 L\in {R}^{...

Google笔试题:哈希表的一个意想不到的应用--在字符串中查找第一个只出现一次的字符

1.问题描述 在一个字符串中找到第一个只出现一次的字符。如输入AbAssvfFCCBbhV,则输出v。   2.解题思路 如果按照传统比较的办法,时间复杂度是O(n*n),这显然不是Google面试官...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:百分点笔试题-写一个哈希表的遍历的算法
举报原因:
原因补充:

(最多只允许输入30个字)