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实现的设计者决定了类型信息的内 ...
随机推荐
- easyui 展开缩起
1.引用jquery-easyui-1.4.4/datagrid-detailview 2.增加属性 view: detailview, detailFormatter: function (rowI ...
- SQL SERVER 提供了一些时间函数:
SQL SERVER 提供了一些时间函数:取当前时间:select getdate()取前一个月的时间:SELECT DATEADD(MONTH,-1,GETDATE()) 月份减一个月取年份:SEL ...
- JavaScript知识体系索引
JavaScript 参考手册 www.w3school.com.cn JavaScript基础语法 JavaScript的数据类型 Javascript的对象分类 JavaScript内置对象 Ja ...
- 对XML文档进行修改
怎样对XML文档时行修改.Insus.NET在此举个简单的例子.XML文档,就以这篇博文:http://www.cnblogs.com/insus/p/3274220.html 如果我们想对其中一个节 ...
- Web Server 在iis下部署php网站在iis下
Web Server 在iis下部署php网站在iis下 一.参考地址: windows8 http://www.cnblogs.com/haocool/archive/2012/10/14/win ...
- Kotlin 变量和常量的声明(var和val)
Kotlin有着非常非常智能化的声明变量方式.叫做类型推断 声明变量要使用关键字var和val. var声明方式第一种(自动推断): var nub=1231://自动定义整数型 使用分号 var c ...
- [Django笔记] admin 深入学习
admin django 内置的管理后台,大部分时候可以通过对admin进行配置来提高开发效率. 数据列表展示 默认情况下显示一个models-objects的列表,如果model定义了 __str_ ...
- 爬取腾讯课堂IT-互联网分类的的课程信息存入csv文件
标签(空格分隔): python from urllib.request import urlopen from bs4 import BeautifulSoup #获取IT-互联网分类每页的课程的链 ...
- 【转】tnsping不通,则需设置TNS_ADMIN环境变量
源地址:http://blog.csdn.net/pan_tian/article/details/7699599
- uoj#422. 【集训队作业2018】小Z的礼物(MIn-Max容斥+插头dp)
题面 传送门 题解 好迷-- 很明显它让我们求的是\(Max(S)\),我们用\(Min-Max\)容斥,因为\(Min(S)\)是很好求的,只要用方案数除以总方案数算出概率,再求出倒数就是期望了 然 ...