zoukankan      html  css  js  c++  java
  • 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;
        }
    
    }
  • 相关阅读:
    ArcSDE 10.1安装、配置、连接 (SQL Server 2008)
    ASP.NET MVC 音乐商店
    ASP.NET MVC 音乐商店
    一些Web开发工具
    Apache 2 频率限制模块
    零起步高性能PHP框架 Phalcon 实战
    零配置Ubuntu下Wordpress安装
    零起步的Hadoop实践日记(hbase in action)
    零起步的Hadoop实践日记(hive in action)
    零起步的Hadoop实践日记(内存设置调整)
  • 原文地址:https://www.cnblogs.com/mengrennwpu/p/6721359.html
Copyright © 2011-2022 走看看