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

原创 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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

遍历Hashtable的几种方法

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

Hashtable类中的四种遍历方法对比

要遍历一个Hashtable,api中提供了如下几个方法可供我们遍历:   keys() - returns an Enumeration of the keys of ...

遍历HashMap的四种方法

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

进程间通信方式总结

linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的。而对Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面...

腾讯面试题-0到9999这1万个数中有多少个数字7

(请不要理解为多少个数包含7)题目0 到 9999 这 1 万个数中有多少个数字 7 ?(请不要理解为多少个数包含 7)思路&答案总共有四位数,每位数的可能分别有10种(0~9)。 每一个位,都会出...

海量数据处理算法(top K问题)

举例有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词。思路 首先把文件分开 针对每个文件hash遍历,统计每个词语的频率 使用堆进行遍...

数组遍历的两种方法和hash的实现

var aa=new Array(1,2,3,4); var num1=aa.length;第一种方法,用循环(利用数组下标) for (var i=0;i { document.write...

面试题总结15 自己构建一个哈希表

 不使用hash库函数可以使用其他如链表类的函数来构建一个哈希表,《stl源码剖析》中讲到hashtable是如何构建的,大致思路如下: 采用开链的方法使表格的负载系数小于1。 哈希散射来将...

整型数组处理算法(十)给定数组a[n],其中有超过一半的数为一个定值,找出这个数。[2014人人网笔试题]

给定数组a[n],其中有超过一半的数为一个定值,找出这个数。[2014人人网笔试题]

整型数组处理算法(九)给定任意一个正整数,求比这个数大且最小的“不重复数”[2014百度笔试题]

给定任意一个正整数,求比这个数大且最小的“不重复数”,“不重复数”的含义是相邻两位不相同, 例如1101是重复数,1231是不重复数。
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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