java 两个Map进行比较

作者&投稿:素支 (若有异议请与网页底部的电邮联系)
Java怎样创建两个KEY的MAP~

就像在XY坐标系中,一个X刻度、一个Y刻度,会对应图上的一个点,即pair(x, y) – > point,那么就有创建一个点,或者根据(x, y)来寻求一个点的需求,如果用Python的语法表达,是这个样子:
Python中表达pair KEY映射MAP的方法

Python

dict((x, y) : point)



dict ( ( x , y ) : point )


然而在JAVA中却变得不容易,骨钩了一下,有这么一些方法:
使用嵌套MAP
嵌套MAP实现双KEY MAP

Java


Map> map = //...
// ...

map.get(2).get(5);



Map > map = //...
// ...
map . get ( 2 ) . get ( 5 ) ;


这种方法将水平的KEY切换成了垂直KEY,我们要找寻XY坐标系中(x, y)对应的点,其实可以先找x点的那条垂直线,然后找出这条垂直线上y高度的那个点。
但是要取得这个双KEY的VALUE,得有2次GET,实例代码没有做第一次GET的NULL判断,有隐患!并且感觉不是很直观。
写一个pair key的包装类
pair key的包装类

Java

public class Key {

private final int x;
private final int y;

public Key(int x, int y) {
this.x = x;
this.y = y;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Key)) return false;
Key key = (Key) o;
return x == key.x && y == key.y;
}

@Override
public int hashCode() {
int result = x;
result = 31 * result + y;
return result;
}

}



public class Key {
private final int x ;
private final int y ;
public Key ( int x , int y ) {
this . x = x ;
this . y = y ;
}
@Override
public boolean equals ( Object o ) {
if ( this == o ) return true ;
if ( ! ( o instanceof Key ) ) return false ;
Key key = ( Key ) o ;
return x == key . x && y == key . y ;
}
@Override
public int hashCode ( ) {
int result = x ;
result = 31 * result + y ;
return result ;
}
}


以这种方法提前包装好一个类,类中有x和y两个属性,同时提供equals方法用于“点”的比较,提供hashCode用于使用在计算对象在散列表中的位置。
为什么要覆盖hashCode方法?请 参见链接
写完这个pair类之后,就好用了:
实现了pair类之后的双key的MAP写法

Java


Map map = //...

map.get(new Key(2, 5));



Map map = //...
map . get ( new Key ( 2 , 5 ) ) ;


这种方法以更多的代码为代价来实现pair key的map,pair class的编写中,不能忘记覆盖equals和hashcode方法,增加了代码量,感觉不是很好用。
GOOGLE的HashBasedTable类库
这种方法感觉才是最直观,最好用的
使用GOOGLE的HashBasedTable实现PAIR KEY

Java

import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;

// 创建
Table plane = HashBasedTable.create();

// 新增
plane.put(1L, 2L, pointA);
plane.put(1L, 3L, pointB);
plane.put(1L, 4L, pointC);

// 获取
Point pointA = plane.get(1L, 2L);
Point pointB = plane.get(1L, 2L);



import com . google . common . collect . HashBasedTable ;
import com . google . common . collect . Table ;
// 创建
Table plane = HashBasedTable . create ( ) ;
// 新增
plane . put ( 1L , 2L , pointA ) ;
plane . put ( 1L , 3L , pointB ) ;
plane . put ( 1L , 4L , pointC ) ;
// 获取
Point pointA = plane . get ( 1L , 2L ) ;
Point pointB = plane . get ( 1L , 2L ) ;


惊叹,好用。在JAVA语言里,写成这样的代码,可称之为艺术。
无限维度的KEY
有两种方法可以实现无线维度的KEY,第一种和本文的第二种方法一样,先写一个CLASS,里面有无限个属性,然后作为MAP的KEY。
第二种,如果类型一样,可以这样子实现:
使用List作为无限MAP的KEY
Java

Map, V> map = //...



Map , V > map = //...


但是这种方法易出错、不易读,并且性能很低。
总结
要实现map的key是两个绑定的属性,或者称之为pair key,个人认为首先使用google的HashBasedTable类库,其次的方法是编写对应的class。

比较map?这得看你object运行时类型是啥,是否是统一的,不然的话你就得首先看Object中,hashcode和equals方法是否都重写

跟你说下思路:
第一步,循环Map1的key,取得key;
第二部,根据key取得对应的List;
第三部,循环List,取出List中的每一项SoftWare跟另外一个Map比较。
如果另外一个Map中没有则创建一个LIst,并加入到该List中,最后将该List放入Map3中。

代码:
import java.util.*;
public class Test2
{
public static void main(String[] args)
{
Map<String,List<SoftWare>> map1 = new HashMap<String,List<SoftWare>>();
Map<String,List<SoftWare>> map2 = new HashMap<String,List<SoftWare>>();
Map<String,List<SoftWare>> map3 = new HashMap<String,List<SoftWare>>();
List<SoftWare> list1 = new ArrayList<SoftWare>();
list1.add(new SoftWare("http://abc.com"));
list1.add(new SoftWare("http://abcd.com"));
list1.add(new SoftWare("http://abcde.com"));
map1.put("Type1",list1);
List<SoftWare> list2 = new ArrayList<SoftWare>();
list2.add(new SoftWare("http://abc.com"));
list2.add(new SoftWare("http://abxd.com"));
list2.add(new SoftWare("http://abgde.com"));
map2.put("Type1",list2);
for (Iterator<String> it=map1.keySet().iterator();it.hasNext() ; )
{
String key = it.next();
List<SoftWare> list = map1.get(key);
List<SoftWare> list3 = new ArrayList<SoftWare>();
for (SoftWare sw : list)
{
if (!IsInMap(sw,map2))
{
list3.add(sw);
}
}
if (list3.size() > 0)
{
map3.put(key,list3);
}
}
System.out.println("downloadLink不一致的元素:");
for (Iterator<String> it=map3.keySet().iterator();it.hasNext() ; )
{
String key = it.next();
List<SoftWare> list = map3.get(key);
System.out.println("软件类型:" + key);
System.out.println("该软件类型下的软件:");
for (SoftWare sw : list)
{
System.out.println(sw.getDownloadLink());
}
}
}
public static boolean IsInMap(SoftWare sw,Map<String,List<SoftWare>> map) {
for (Iterator<String> it=map.keySet().iterator();it.hasNext() ; )
{
String key = it.next();
List<SoftWare> list = map.get(key);
for (SoftWare sws : list)
{
if (sws.getDownloadLink().equals(sw.getDownloadLink()))
{
return true;
}
}
}
return false;
}
}
class SoftWare
{
private String downloadLink;
public void setDownloadLink(String downloadLink) {
this.downloadLink = downloadLink;
}
public String getDownloadLink() {
return this.downloadLink;
}
SoftWare(String downloadLink) {
this.downloadLink = downloadLink;
}
SoftWare() {
}
}

假如有三个 map 分别为 map1 ,map2 , map3
for(Map.Entry<String,List<SoftWare>> entry : map1){
List<SofWare> list1 = entry.getValue();
//获取第二个map中的 list
List<SoftWare> list2 = map2.get(entry.key());
//创建一个新的list ,存放不同内容
List<SoftWare> list3 =new ArrayList<SoftWare>();
for(SoftWare sw1 : list1){
boolean b = true; //表示是否有不同,默认有不同
for(SoftWare sw2 : list2){
if(sw1.downloadLink.equals(sw2.downloadLink)){
b = false;
break ;
}
}
//遍历结束后,如果b =true ,代表 sw1在list2中不存在
if(b){ //此时代表 有不同
list3.add(sw1);
}
}
map3.put(entry.getKey(),list3);
}

你这问题有歧义啊,既然存的是list集合,怎么知道比较的是哪两个,下标又不确定。万一每个集合里都有很多软件,你怎么比?


龙城区13958253462: java 两个Map进行比较 -
宿春霡欣: 跟你说下思路: 第一步,循环Map1的key,取得key; 第二部,根据key取得对应的List; 第三部,循环List,取出List中的每一项SoftWare跟另外一个Map比较. 如果另外一个Map中没有则创建一个LIst,并加入到该List中,最后将该List放入Map...

龙城区13958253462: java如何写两个map比较? -
宿春霡欣: Map map1 = new HashMap(); Map map2 = new HashMap(); map1.put("a", "aa"); map1.put("b", "bb"); map1.put("c", "cc"); map2.put("1", "11"); map2.put("b", "22"); map2.put("3", "33");Iterator it = map1.keySet()....

龙城区13958253462: java中两个hashmap怎么对比 -
宿春霡欣:hashmap比较,可以通过相应的keyset获取键值进行比较 public static void main(String[] args) {Map map1=new HashMap();Map map2=new HashMap(); map1.put("key1", "v1");map1.put("key2", "v2");map1.put("key3", ...

龙城区13958253462: java中map有哪几种实现方式,并且比较异同 -
宿春霡欣: Map是一种把键对象和值对象进行关联的容器,而一个值对象又可以是一个Map,依次类推,这样就可形成一个多级映射.对于键对象来说,像Set 一样,一个Map容器中的键对象不允许重复,这是为了保持查找结果的一致性;如果有两个键对...

龙城区13958253462: java 中怎么比较两个变量的大小 -
宿春霡欣: 更改代码如下:pwd.equals(rpwd)即可,因为==的用法是:1. 比较基本类型的变量 2. 引用类型比较时,二者的地址相同,才会返回true,而我们现在这里的用法,是引用类型String,显然二者的地址不同,故一直返回false.

龙城区13958253462: Java中HashMap和TreeMap的区别深入理解 -
宿春霡欣: HashMap底层是用数组做的,TreeMap是基于树做的 这么做的结果就是HashMap的数据在不停的添加的时候效率会比较低,而对于查找的效率是比较快的,TreeMap对于添加的效率是比较高的但是对于查找的效率要相对比较低一些 这里简单从...

龙城区13958253462: Java中Map和Map<key,value>的区别. -
宿春霡欣: Map<key,value>是Map的一个泛型形式,俩个Map之间实际上是一个东西,但是用法却有点不一样 Map:里面存放的是键值对集合,键值对的类型可以是任意封装类型 例:Map map=new HashMap();//以下的俩种使用方式都是对的 map.put(...

龙城区13958253462: java中字符串类型的List中某一元素与Map<String,Integer> map的键进行比较,怎么写代码呢? -
宿春霡欣: List list=new ArrayList(); list.add("what"); Map map=new HashMap(); map.put("what",1); map.put("is",2);//下面是比较代码,及保存到sameMap中 Map sameMap= new HashMap(); for (Object obj:list) { for (Object mapObj : map.keySet()) { if (obj.equals(mapObj)) { sameMap.put(mapObj, map.get(mapObj)); } } }

龙城区13958253462: java 得到一个数组和一个map集合 ,怎样才能把这个数组中的值跟map中的key进行比较? -
宿春霡欣: for(){ Stirng str= shuzu.get(i); if(str.equal(map.getKey("1242"))){} }

龙城区13958253462: java map提取相同值的问题 -
宿春霡欣: for(String key : map1){ if(map2.contains(key)){ if(map1.get(key) == map2.get(key)){ //你的逻辑 } } }

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网