近期项目中需要针对多种不同来源指定的相同类型内容进行合并,实现过程中需要根据指定的相关维度,对资源内容进行分组,如识别是否可以为同一人员信息,是否为同一个歌曲或影视信息,因此针对实现的具体细节做如下备份,以供后期查看和使用,如果有错误问题,敬请指正!

public void Map<String,Set<String>> groupByPersonByVideoName(){
// 获取对应人员下的的影视信息,判别该人员是否可以合并为一个人,假设当前已进行获取人员的影视信息(key为personId,value为不同来源的视频名称)
Map<String,Set<String>> authorVideoNames = Maps.newHashMap(); List<String> sourceKeys = CollectionUtil.set2List(authorVideoNames.keySet()); // 最终分组
List<Set<String>> groups = Lists.newArrayList();
// 采用冒泡排序的方法,进行两两比较,如果有相同的视频名称,则判定为同一个人
for(int i = 0; i < sourceKeys.size(); i++){
Set<String> group = Sets.newHashSet();
for(int j = i; j < sourceKeys.size(); j++){
if(i == j || CollectionUtil.hasSameItems(authorVideoNames.get(sourceKeys.get(i)),authorVideoNames.get(sourceKeys.get(j)))){
group.add(sourceKeys.get(j));
}
}
groups.add(group);
} // 判断分组之间是否存在包含的关系,即三个来源A、B、C,A和B中有对应的相同影视,B和C中有另一相同的影视信息,则判定A、B、C为同一人员
List<Set<String>> finalGroups = Lists.newArrayList();
for(int i = 0; i < groups.size(); i++){
Set<String> finalGroup = Sets.newHashSet();
for(int j = i; j < groups.size(); j++){
// 如果已经分组过,则不需要再处理
if(CollectionUtil.isContainsElesInColl(finalGroups,groups.get(j))){
continue;
}
// 如果有相同的名称信息,则加入以处理过分组中
if(i == j || CollectionUtil.hasSameItems(groups.get(i),groups.get(j))){
finalGroup.addAll(groups.get(j));
}
}
if(finalGroup.size() > 0){
finalGroups.add(finalGroup);
}
}
return finalGroups;
}

相关的工具类,封装如下:

import java.util.*;

public class CollectionUtil {

    /**
* 将list转换为set
* @param list
* @param <T>
* @return
*/
public static <T> Set<T> list2Set(List<T> list){
Set<T> set = new LinkedHashSet<T>();
for(T ele : list){
set.add(ele);
}
return set;
} /**
* 将set转为list
* @param set
* @param <T>
* @return
*/
public static <T> List<T> set2List(Set<T> set){
List<T> list = new ArrayList<T>();
for(T ele : set){
list.add(ele);
}
return list;
} /**
* 判断数组中是否具有相同的信息
* @param list1
* @param list2
* @return
*/
public static <T> boolean hasSameItems(Collection<T> list1, Collection<T> list2){
for(T info : list1){
if(list2.contains(info)){
return true;
}
}
return false;
} /**
* 判断分组中是否包含所有的元素
* @param groups
* @param infos
* @return
*/
public static boolean isContainsElesInColl(List<Set<String>> groups, Set<String> infos){
if(groups.size() == 0 || infos.size() == 0){
return false;
}
for(String info : infos){
for(Set<String> group : groups){
if(group.contains(info)){
return true;
}
}
}
return false;
} /**
* 判断分组中是否包含指定元素
* @param groups
* @param sourceKey
* @return
*/
public static boolean isContainsEleInColl(List<Set<String>> groups, String sourceKey){
for(Set<String> group : groups){
if(group.contains(sourceKey)){
return true;
}
}
return false;
} }

Java方法-对指定信息基于相关维度进行分组的更多相关文章

  1. 请阐述调用Activity有哪几种方法,并写出相关的Java代码

    请阐述调用Activity有哪几种方法,并写出相关的Java代码. 答案:可以采用两种方式调用Activity:显示调用和隐式调用.显示调用直接指定了Activity,代码如下: Intent int ...

  2. java 反射提取类信息, 动态代理 和过滤某些方法演示

    java 反射提取类信息, 动态代理 和过滤某些方法演示 package org.rui.classts.reflects; import java.lang.reflect.Constructor; ...

  3. java动态载入指定的类或者jar包反射调用其方法

    序言 有时候.项目中会用到java动态载入指定的类或者jar包反射调用其方法来达到模块的分离,使各个功能之间耦合性大大减少,更加的模块化.代码利用率更高.模式中的代理模式就用到java的这一机制. 下 ...

  4. 伪基站,卒于5G——本质上是基于网络和UE辅助的伪基站检测,就是将相邻基站的CI、信号强度等信息通过测量报告上报给网络,网络结合网络拓扑、配置信息等相关数据,对所有数据进行综合分析,确认在某个区域中是否存在伪基站

    伪基站,卒于5G from:https://www.huxiu.com/article/251252.html?h_s=h8 2018-07-05 21:58收藏27评论6社交通讯     本文来自微 ...

  5. JAVA中生成指定位数随机数的方法总结

    JAVA中生成指定位数随机数的方法很多,下面列举几种比较常用的方法. 方法一.通过Math类 public static String getRandom1(int len) { int rs = ( ...

  6. Java系列--第八篇 基于Maven的SSME之定时邮件发送

    关于ssme这个我的小示例项目,想做到麻雀虽小,五脏俱全,看到很多一些web都有定时发送邮件的功能,想我ssme也加入一下这种功能,经查询相关文档,发现spring本身自带了一个调度器quartz,下 ...

  7. Android进程so注入Hook java方法

    本文博客链接:http://blog.csdn.net/qq1084283172/article/details/53769331 Andorid的Hook方式比较多,现在来学习下,基于Android ...

  8. C++调用JAVA方法详解

    C++调用JAVA方法详解          博客分类: 本文主要参考http://tech.ccidnet.com/art/1081/20050413/237901_1.html 上的文章. C++ ...

  9. Java方法区

    方法区 在一个jvm实例的内部,类型信息被存储在一个称为方法区的内存逻辑区中.类型信息是由类加载器在类加载时从类文件中提取出来的.类(静态)变量也存储在方法区中. jvm实现的设计者决定了类型信息的内 ...

随机推荐

  1. 读取url接口数据

    string url = "http://localhost:8180/city-smscenter/smscenter?cmd=flowsms.queryMobileSmsList& ...

  2. SQLServer存储引擎——04.数据

    4. SQL SERVER存储引擎之数据篇 (4.1)文件 (0)主数据文件.mdf初始文件大小至少为3MB,次要数据文件.ndf初始大小,同日志文件一样至少为512KB: (1)SQL SERVER ...

  3. 泛型List<T>转存为XML文档

    经常会有这情况,在程序处理结果为泛型List<T>,但为了能把这些集合输出XML文档.Insus.NET就因此问题,演示一个范例.在程序中,创建一个类: List<T>的集合手 ...

  4. 基于vue框架项目开发过程中遇到的问题总结(一)

    (一)关于computed修改data里变量的值 问题:computed里是不能直接修改data里变量的值,否则在git commit 时会报错 解决:在computed里使用get和set来进行获取 ...

  5. GIT版本控制系统(二)

    貌似第二条有点用,还木有都验证过,贴过来再说~ 转自: http://www.cnblogs.com/lhb25/p/10-useful-advanced-git-commands.html 1. 导 ...

  6. html二

    超链接 超链接有三种形式: 1.外部链接:链接到外部文件.举例: <a href="new.html">点击进入到新网页</a> a是英语anchor“锚” ...

  7. 函数声明后面的const用法

    void function() const{} 通常我们会看到一些函数声明后面会跟着一个const,这个const是做什么的呢? 看一下下面的例子,就知道了.直接在编译前,就会提示下面的两个错误 // ...

  8. matplotlib类

    1.plt.subplot 在matplotlib下,一个Figure对象可以包含多个子图(Axes),可以使用subplot()快速绘制,其调用形式如下:subplot(numRows, numCo ...

  9. C# 实现retry

    C# 有try-catch ,但是没有retry 功能,通过用有限次循环的办法来模拟Retry,当然中间需要加一个等待的过程. 我们可以利用C#的匿名方法(anonymous methods)和匿名委 ...

  10. 基础线程机制--Daemon,sleep(),yield()

    Daemon   守护线程是程序运行时在后台提供服务的线程,不属于程序中不可或缺的部分,当所有非守护进程执行完成时,程序也就终止,同时会杀死所有的守护进程.main()属于非守护线程.可以使用setD ...