JAVA链表Map的用法

1 篇文章 0 订阅

转载至:http://blog.sina.com.cn/s/blog_5e8a23f90101fm4v.html

JAVA的容器设计中有一个链表Map类,它是由一对对象(key, value) 组成的一个链。(key, value)键值对。由键名很容易找到它对应的值,WONDOWS的注册表就是由键值对构成的链。链表的优越性在于它随时可以添加和删除一项,它的缺点是没有索引,不方便顺序获取数据。

Map是个抽象类,不能用构键器来构造一个Map类实例,我们必须用

Map m = new HashMap();

来建立一个Map。实际上我们使用的是HashMap的方法(对Map的抽象方法的具体实现)。常用的方法:

 

public Object get(Object)      由键得到值,即返回value

public Object put(Object,Object)   添加一个键值对

public void clear()                清除所以的项,成空链表了

public boolean isEmpty()      是空链表吗?

public Set entrySet()             返回一个集合,它包含所有的键值对

public void putAll(Map)              把一个Map加入到这个链表中。

public int size()                    链表的长度

public Collection values()      返回包含所有值的集合

public Object remove(Object)              移除指定的键

public Set keySet()               返回包含所有键的集合

public boolean containsKey(Object)     是否包含指定的键

public boolean containsValue(Object)   是否包含指定的值

public int hashCode()                         

public boolean equals(Object)

public String toString()

 

下面的例1 演示了如何用给Map添加元素,用get方法查询,以及移掉一项。

 

1 测试Map的性能和用法

// MapTest.java

import java.util.*;

 

public class MapTest {

public static void main(String[] args){

// Map m = new Map();

  Map m = new HashMap();

  m.clear();

  m.put("America","美国");

  m.put("China","中国");

  m.put("Japen","日本");

  m.put("Russia","俄罗斯");

  m.put("Korea","韩国");

  System.out.println(m.entrySet());

  System.out.println(m.keySet());

  System.out.println(m.values());

  System.out.println(m.get(" China"));

  System.out.println(m.get("中国"));

//  说明get 只能够由key得到value

  String q = m.containsValue("美国")?"Map值中包含美国":"不!不包含!";

  System.out.println(q);

  Map m6 = new HashMap();

  m6.putAll(m);

  m6.put("NorthKorea", "朝鲜");

  int n = m6.size();

  System.out.println( n +"方会谈:" +m6.values()); 

  m6.remove("中国"); n = m6.size();

  // m6.remove("中国"); 没东西被移除

  System.out.println( n +"方会谈:" +m6.values()); 

}

}

本程序的输出如下:

[America=美国, Russia=俄罗斯, Korea=韩国, Japen=日本, China=中国]

[America, Russia, Korea, Japen, China]

[美国, 俄罗斯, 韩国, 日本, 中国]

中国

null

Map值中包含美国

6方会谈:[美国, 朝鲜, 俄罗斯, 韩国, 日本, 中国]

6方会谈:[美国, 朝鲜, 俄罗斯, 韩国, 日本, 中国]

第一行由语句System.out.println(m.entrySet())输出,它是全链表。第二第三行分别是键和值的集合(Set 和Colloction)。第五行的null是因为m.get("中国")返回的空, 这说明不能从value 倒过来查key。最后一行和它的前一行相同是因为m6.remove("中国")不起作用。如果改为m6.remove("China")就起作用了。

 

 

2 演示如何用数组来生成Map

// MapTest1.java

import java.util.*;

import com.shps.util.CountryChs;

 

public class MapTest1 {

public static void main(String[] args) {

 String[][] pairs = CountryChs.pairs ;

 Map m = new HashMap();

 int n = pairs.length;

 for(int i=0; i

   m.put(pairs[i][0],pairs[i][1]);

 System.out.println(m.containsKey("China"));

 System.out.println(m.get("俄罗斯"));

}

}

对于这个Map,你可以用来测试Map的各种方法(自己修改代码,如北京是哪国的首都?)。

本例中使用了一个二维的字符串数组pairs,它定义在类CountryChs中,并编译好放在包com.shps.util 中。它是一个纯中文的(国家,首都)对。包含了几乎世界上所有的国家。因为很长,不方便全部登出,下面截取一段例示。

 

// CountryChs.java

package com.shps.util;

public class CountryChs {

public static final String[][] pairs = {

//非洲

{"阿尔及利亚","阿尔及尔" },{ "安哥拉","罗安达" },

{"贝宁","波多诺伏" },{ "博茨瓦纳","卡玻隆" },

{"布基纳法索","瓦加杜古" },

 

//亚洲

{"阿富汗","喀布尔" },{ "巴林","麦纳麦" },

{"孟加拉国","达卡" },{ "不丹","廷布" },

{"文莱","斯里巴加湾市" },

{"柬埔寨","金边"}, {"中国","北京"},

/欧洲

{"阿尔巴尼亚","地拉那" },{ "安道尔","安道尔城" },

{"奥地利","维也纳"},{"比利时","布鲁塞尔"},

{"丹麦","哥本哈根"},{"爱沙尼亚","塔林" },

{"德国","柏林"},{"希腊","雅典"},

{"匈牙利","布达佩斯"},{"冰岛","雷克雅未克" },

};

}

你如果编译这个文件,可以得到一个不完整的国家—首都字符串数组。

 

下面我们利用这个链表编写一个由首都名查国家的程序。因为没有象get(key)那样的方法可以从可以由value 查找key。所以我除了利用(国家-首都)对字符串数组生成链表m外,还生成另外两个链表mapContries mapCapitals,它们分别由正整数和CountryCh. pairs中的第一、第二列生成。本想通过首都名用遍历法确定key,再在mapContries链表中由key查找到国家名。但是,我的设想失败了。我想,对应的国家-首都在字符串数组中的次序相同,他们生成的链表中同一i对应的国家-首都应该是能够配对的,其实不然。这是因为生成Map用的是HashMap(),项在链表中的次序和他们加入链表时的次序不一致,这在例1中可以看到。所以我只好把这两个链表在转化为数组mapContries.values().toArray(),再利用数组的索引来找到国家名。所幸转化成的两数组中,国家-首都倒是配对的。

 

本程序定义了方法,fill(Map m, String[][] d)方法用来从“国家-首都“字符串数组生成链表m;而fill2(Map m1,Map m2, String[][] d) 方法则生成链表mapContries mapCapitals。最后,查“东京”的国名得到了“日本”,测试成功。

 

3 利用Map的查询

// MapTest2.java

import java.util.*;

import com.shps.util.*;

 

public class MapTest2 {

 static String[][] pairs = CountryChs.pairs ;

 static int length = pairs.length ;

public static void main(String[] args) {

 Map m = new HashMap();

 fill(m, pairs);

 Map mapContries = new HashMap();

 Map mapCapitals = new HashMap();

 fill2(mapContries ,mapCapitals, pairs);

 Object[] contries = mapContries.values().toArray(); 

 Object[] capitals = mapCapitals.values().toArray(); 

//Test Mapm

 if(m.containsKey("巴勒斯坦"))

   System.out.println("有巴勒斯坦国");

 else

   System.out.println("找不到巴勒斯坦国");

 System.out.println("俄罗斯的首都是" + m.get("俄罗斯"));

 

// Test other two Map 找首都为东京的国家

  String capi = "东京"; 

  for(int i=0; i

    if(capitals[i]==capi)

      System.out.println(capi +

       "" +contries[i] +"首都");

} //main()

 

 static void fill(Map m, String[][] d){

  for(int i=0; i

     Pair p = new Pair(d[i][0], d[i][1]);

     m.put(p.key, p.value);

   }

 }

 static void fill2(Map m1,Map m2, String[][] d){

  for(int i=0; i

     m1.put(i, d[i][0]);

     m2.put(i, d[i][1]);

   }

 }

}

程序的输出为:

找不到巴勒斯坦国

俄罗斯的首都是莫斯科

东京是日本首都

 

查找还是用ArrayList更方便

 

从上面的例子中我们可以看到,由于Map容器没有索引,所以从value  key 很不方便。那么有没有一种容器,既有容器可以自由的优点,又有数组利用索引便捷操作的长处?有!那就是数组列表ArrayList

下面的程序第一段演示Map 的值创建一个ArrayList,然后任意截取一段打印出来。而第二段分别用国家和首都字符串直接创建两个ArrayList,用一首都名查找它的国家名。双向查找同样的方便。

 

4 ArrayList查找

 

// ArrayListTest.java

import java.util.*;

import com.shps.util.*;

 

public class ArrayListTest {

public static void main(String[] args) {

 Map m = new HashMap();

 String[][] d = CountryChs.pairs;

 int len = d.length;

 for(int i=0; i

     m.put(d[i][0], d[i][1]);

 

// 生成m的值的列表,并显示其一段

 Collection values = m.values();

 List list = new ArrayList(values);

 List sub = list.subList(37, 46); 

 System.out.println(sub.toString());

 

// 分别创建国家和首都的ArrayList,用于查找

 List contryList = new ArrayList();

 List capitalList = new ArrayList();

 for(int i=0; i

  contryList.add(d[i][0]);

  capitalList.add(d[i][1]);

 }

 

// 测试查找功能

 String find = "哈瓦那";

 System.out.print(find + ""); 

 for(int i=0;i

  if(capitalList.get(i) == find)

    System.out.println(contryList.get(i) + "的首都");  

  }

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值