Java方法-对指定信息基于相关维度进行分组
近期项目中需要针对多种不同来源指定的相同类型内容进行合并,实现过程中需要根据指定的相关维度,对资源内容进行分组,如识别是否可以为同一人员信息,是否为同一个歌曲或影视信息,因此针对实现的具体细节做如下备份,以供后期查看和使用,如果有错误问题,敬请指正!
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方法-对指定信息基于相关维度进行分组的更多相关文章
- 请阐述调用Activity有哪几种方法,并写出相关的Java代码
请阐述调用Activity有哪几种方法,并写出相关的Java代码. 答案:可以采用两种方式调用Activity:显示调用和隐式调用.显示调用直接指定了Activity,代码如下: Intent int ...
- java 反射提取类信息, 动态代理 和过滤某些方法演示
java 反射提取类信息, 动态代理 和过滤某些方法演示 package org.rui.classts.reflects; import java.lang.reflect.Constructor; ...
- java动态载入指定的类或者jar包反射调用其方法
序言 有时候.项目中会用到java动态载入指定的类或者jar包反射调用其方法来达到模块的分离,使各个功能之间耦合性大大减少,更加的模块化.代码利用率更高.模式中的代理模式就用到java的这一机制. 下 ...
- 伪基站,卒于5G——本质上是基于网络和UE辅助的伪基站检测,就是将相邻基站的CI、信号强度等信息通过测量报告上报给网络,网络结合网络拓扑、配置信息等相关数据,对所有数据进行综合分析,确认在某个区域中是否存在伪基站
伪基站,卒于5G from:https://www.huxiu.com/article/251252.html?h_s=h8 2018-07-05 21:58收藏27评论6社交通讯 本文来自微 ...
- JAVA中生成指定位数随机数的方法总结
JAVA中生成指定位数随机数的方法很多,下面列举几种比较常用的方法. 方法一.通过Math类 public static String getRandom1(int len) { int rs = ( ...
- Java系列--第八篇 基于Maven的SSME之定时邮件发送
关于ssme这个我的小示例项目,想做到麻雀虽小,五脏俱全,看到很多一些web都有定时发送邮件的功能,想我ssme也加入一下这种功能,经查询相关文档,发现spring本身自带了一个调度器quartz,下 ...
- Android进程so注入Hook java方法
本文博客链接:http://blog.csdn.net/qq1084283172/article/details/53769331 Andorid的Hook方式比较多,现在来学习下,基于Android ...
- C++调用JAVA方法详解
C++调用JAVA方法详解 博客分类: 本文主要参考http://tech.ccidnet.com/art/1081/20050413/237901_1.html 上的文章. C++ ...
- Java方法区
方法区 在一个jvm实例的内部,类型信息被存储在一个称为方法区的内存逻辑区中.类型信息是由类加载器在类加载时从类文件中提取出来的.类(静态)变量也存储在方法区中. jvm实现的设计者决定了类型信息的内 ...
随机推荐
- SQL/T-SQL实例参考-1
CASE ,D.[Score] B_Score ,'Distince'= CASE WHEN C.Score > D.Score THEN C.[Score] - D.[Score] WHEN ...
- [TJOI2015]线性代数(网络流)
[TJOI2015]线性代数(最大权闭合子图,网络流) 为了提高智商,ZJY开始学习线性代数.她的小伙伴菠萝给她出了这样一个问题:给定一个n*n的矩阵B和一个1×n的矩阵C.求出一个1×n的01矩阵A ...
- Python Flask模块
模块是一个包含响应文本的文件,其中包含占用位变量表示的动态部分,其具体值只在请求的上下文中才知道.使用真实值替换变量,再返回最终得到的响应字符串,这一过程称为渲染.为了渲染模块,Flask使用一个名为 ...
- JBOSS在win7环境下启动run.bat无反应
今天从隔壁机器拷贝了一份Jboss,却发现启动无任何反应. 仔细对比了jdk jboss的各项参数发现都是相同,无奈之下,检查run.bat文件 发现时在此句出现前后 无反应: "%JAVA ...
- 析构函数-复制构造函数-赋值操作符重载-默认构造函数<代码解析>
通过下面primer中的一道习题,可以更深刻的了解,析构函数,复制构造函数,赋值操作符重载,默认构造函数的使用. 但是我的结果与primer习题解答里面的并不相同,可能是编译器不同的原因导致. // ...
- .NET 反射
反射是.NET很强大的一个机制. 它就像照妖镜一般的存在.它能调用你的任意私有成员,如:私有构造函数.私有方法.私有字段. 类的构造函数声明为了private,别人无法实例化对象出来?No,No,No ...
- loj #6485. LJJ 学二项式定理 (模板qwq)
$ \color{#0066ff}{ 题目描述 }$ LJJ 学完了二项式定理,发现这太简单了,于是他将二项式定理等号右边的式子修改了一下,代入了一定的值,并算出了答案. 但人口算毕竟会失误,他请来了 ...
- luogu1632 点的移动
其实只需要开三重循环 根据OI中的一个重要的原理 给定一个序列a,求一个数x使得\(\sum |a_i-x|\)最小,那么这个数是序列a的中位数 证明略 然后既然是中位数,一定是数列中的数,类比到这题 ...
- [TJOI2013]循环格 费用流 BZOJ3171
题目背景 一个循环格就是一个矩阵,其中所有元素为箭头,指向相邻四个格子.每个元素有一个坐标(行,列),其中左上角元素坐标为(0,0).给定一个起始位(r,c),你可以沿着箭头方向在格子间行走.即:如果 ...
- tomcat启动优化
tomcat的最佳实践运行模式 Tomcat Connector三种运行模式(BIO, NIO, APR)的比较和优化. org.apache.coyote.http11.Http11Protocol ...