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实现的设计者决定了类型信息的内 ...
随机推荐
- 关于执行memcached报错问题
执行#/usr/local/memcached/bin/memcached随后出现如下错误:./memcached: error while loading shared libraries: lib ...
- day05.1-文件归档与压缩
>:覆盖式修改文件内容.如: a). cat /etc/passwd > new_pass.txt(将/etc/passwd中的内容覆盖式复制到new_pass.txt中,若n ...
- 微信小程序小结(5) -- 常用语法
在 pages 字段的第一个页面就是这个小程序的首页(打开小程序看到的第一个页面). Page生命周期 属性 类型 描述 onLoad Function 生命周期函数--监听页面加载.一个页面只会调用 ...
- 【沽泡学院07】基于ElasticSearch搜索附近的人
1. 为什么要选择ElasticSearch 1)ElasticSearch 优点: 分布式.实时的.Push replication 完全支持Apache Lucene的接近实时的搜索 处理多租户( ...
- SQLAlchemy外键的使用
orm可以将数据库存储的数据封装成对象,同时,如果封装的好的话,所有的数据库操作都可以封装到对象中.这样的代码在组织结构上会非常的清晰,并且相对与使用sql语句在sql注入方面会极具降低. SQLAl ...
- Sublime3插件安装
首先声明一下,小编是做后台开发出身,但是总是想捣鼓一些小的网站出来,可能是完美心作祟,感觉前端这边不能差事,所以就自己上了,一开始是用eclipse来开发的,具体原因忘了,也不知道怎么就开始用Subl ...
- 12.Hamming Distance(汉明距离)
Level: Easy 题目描述: The Hamming distance between two integers is the number of positions at which th ...
- 洛谷 P1801 黑匣子_NOI导刊2010提高(06)
题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个Black Box要处理一串命令. 命令只有两种: ...
- jquery发送请求
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- zookeeper分布式锁简单实现(JavaApi)
1.创建会话连接 package com.karat.cn.zookeeperAchieveLock.javaapilock; import org.apache.zookeeper.WatchedE ...