java 两个Map进行比较

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 两个Map进行比较相关的知识,希望对你有一定的参考价值。

Map的格式:Map<String, List<SoftWare>>
//String是软件类型,List里边放了一堆软件
目的是:比较2个Map中的SoftWare对象里的downloadLink字段,是否相同
如果有不同,则存放到第三个Map<String, List<SoftWare>>中。

跟你说下思路:
第一步,循环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()

参考技术A 假如有三个 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);
参考技术B 你这问题有歧义啊,既然存的是list集合,怎么知道比较的是哪两个,下标又不确定。万一每个集合里都有很多软件,你怎么比?追问

list里边,就是有很多软件的
就是要比较两个 map中的不同软件去比较

为啥java中有两个接口可比较和比较器用于对集合进行排序? [复制]

【中文标题】为啥java中有两个接口可比较和比较器用于对集合进行排序? [复制]【英文标题】:why there is two interface comparable and comparator in java for sorting the collections? [duplicate]为什么java中有两个接口可比较和比较器用于对集合进行排序? [复制] 【发布时间】:2016-10-23 20:42:54 【问题描述】:

为什么在 java 中有两个接口可比较和比较器用于对集合进行排序?

似乎两者都在执行相同的任务...对这种排序技术感到困惑?请指教

【问题讨论】:

google 在提问之前。 difference between Comparable and Comparator A blog post regarding comparable and comparator 这不是为了讨论,这是为了解决问题,所以请提出正确的问题,检查这个programcreek.com/2011/12/… 【参考方案1】:

人们可能希望以其他方式对给定对象进行排序,而不是在给定对象中定义它(使用Comparable),这就是Comparator 可用的原因。

Comparable - 在给定的类中用于定义默认/自然排序排序

Comparator - 由foreign 代码(例如来自不同库)用于以不同方式对数据进行排序,或将排序添加到未定义Comparable 的类中,或添加不同的排序顺序(例如,有时您可能希望对字符串进行排序不区分大小写,有时也区分大小写)。

【讨论】:

以上是关于java 两个Map进行比较的主要内容,如果未能解决你的问题,请参考以下文章

java中两个map比较

仅将两个文本大文件与 Java 中的 URL 与外部存储器进行比较?

java中list里面存放map,根据map中的某两个个字段进行排序

Java比较两个String字符串数组

java8中,两个list<map>集合如何合并?

java使用反射比较两个bean对象属性值是否相等