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实现的设计者决定了类型信息的内 ...
随机推荐
- Transfer data to SQL Server from SPC-Light with Excel macros
公司的QA检测软件SPC-Light,需要从其中读取一些信息至SQL Server数据库,储存或是做其它分析. 先是在Excel的VBE的工具中,引入一个组件Microsoft ActiveX Dat ...
- Data Base sql server 备份数据库
sql server 备份数据库 1.维护计划向导: 右键维护计划-维护计划向导-然后安装提示: 勾选自己要干的事,比如:完整备份数据库.差异备份数据库等等 2.作业计划: 如下图: SQL Serv ...
- RPN(区域生成网络)
转:懒人元(侵删) RPN全称是Region Proposal Network,Region Proposal的中文意思是“区域选取”,也就是“提取候选框”的意思,所以RPN就是用来提取候选框的网络. ...
- completer自动完成
由于项目需要,在输入框中要做一些输入限制的同时,更加要求用户体验,提供一些自动完成设置.所以有需求,总会有解决方式,下面说一下自动完成插件的原理: html的body部分: <span styl ...
- 洛谷P2526 [SHOI2001]小狗散步(二分图匹配)
题目背景 Grant喜欢带着他的小狗Pandog散步.Grant以一定的速度沿着固定路线走,该路线可能自交.Pandog喜欢游览沿途的景点,不过会在给定的N个点和主人相遇.小狗和主人同时从(X1,Y1 ...
- powershell 操作sharepoint命令集
打开SharePoint 2013 Management Shell, and then run as administrator.执行如下命令 1. 添加wsp和安装Add-SPSolution - ...
- Python——用os模块寻找指定目录(包括子目录)下所有图片文件
import os # 导入os模块 def search_file(start_dir): img_list = [] extend_name = ['.jpg', '.png', '.gif'] ...
- P3369 【模板】普通平衡树(权值线段树)
原来线段树还有这种操作(开成一个桶) 用区间维护在这个区间内元素的个数,离散化一下,居然能达到splay的效果 不仅码量大大减少,而且跑的飞快!!! 6种操作 200多ms 插入 xx 数 删除 x ...
- luogu4345 [SHOI2015]超能粒子炮·改(组合数/Lucas定理)
link 输入\(n,k\),求\(\sum_{i=0}^k{n\choose i}\)对2333取模,10万组询问,n,k<=1e18 注意到一个2333这个数字很小并且还是质数这一良好性质, ...
- 10.15 lzxkj
几天前写的,忘了放了,在此填坑 10月16的题我出的不写题解了 lzxkj 题目背景 众所不周知的是, 酒店之王 xkj 一个经常迷失自我的人 有一天, 当起床铃再一次打响的时候, TA 用 O(1) ...