java集合实用操作总结

Collections

1.sort(Comparator<? super E>):void List 对集合中的元素排序:
2.reverse(List<?>):void 反转集合中的元素:
3.shuffle(List<?>):void 打乱元素中的元素:
4.fill(List<? super T>,T):void 用T元素替换掉集合中的所有的元素:
5.copy(List<? super T>,List<? extend T>):void 复制并覆盖相应索引的元素:
6.min/max(Collection<? extends T>):T 找到集合中最大/小的元素:
7.swap(List<?>,int,int):void 交换集合中指定元素索引的位置:
8.rotate(List<?>,int):void 集合中的元素向后移m个位置,在后面被遮盖的元素循环到前面来.
9.indexOfSubList(List<?>,List<?>):int / lastIndexOfSubList(List<?>,List<?>):int 找出参数2在参数1第一次出现的位置:
10.replaceAll(List,T,T):boolean 替换成指定的元素:
11.synchronizedXxx方法 可以将某集合转化成线程安全的容器之后再使用:
12.unmodifiableCollection(Collection<? extends T>):Collection将集合变为不可修改:

Guava

依赖

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>30.1.1-jre</version>
</dependency>


1.BiMap提供了一种key和value双向关联的数据结构

2.Multimap提供了将一个键映射到多个值的形式

3.RangeMap描述了一种从区间到特定值的映射关系,让我们能够以更为优雅的方法来书写代码

4.ClassToInstanceMap是一个比较特殊的Map,它的键是Class,而值是这个Class对应的实例对象

5.Joiner指定分隔符关联集合,可以过滤空值

6.Splitter可以对字符串进行分割,其分割的方式有两种——按字符/字符串分割和按正则进行分割,结果是集合

 

Hutool

依赖

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>4.5.15</version>
</dependency> 

MapUtil,针对Map的一一列工具方法的封装
.isEmpty、isNotEmpty 判断Map为空和非空方法,空的定义为null或没有值
.newHashMap 快速创建多种类型的HashMap实例
.createMap 创建自定义的Map类型的Map
.of 此方法将一个或多个键值对加入到一个新建的Map中
.toListMap 行转列,合并相同的键,值合并为列表
.toMapList 列转行。将Map中值列表分别按照其位置与key组成新的map
.join、joinIgnoreNull 将Map按照给定的分隔符转换为字符串
.filter 1、过滤出需要的对象,如果返回null表示这个元素对象抛弃 2、修改元素对象,返回集合中为修改后的对象
.reverse Map的键和值互换
.sort 排序Map
.getAny 获取Map的部分key生成新的Map
.get、getXXX 获取Map中指定类型的值

集合工具-CollUtil
1. join 方法 将集合转换为字符串
2. sortPageAll 将给定的多个集合放到一个列表(List)中,根据给定的Comparator对象排序,然后分页取数据
3.newHashMap、newHashSet、newArrayList方法 这些方法是新建相应的数据结构
4.sub方法 对集合切片,其他类型的集合会转换成List
5.zip方法 给定两个集合,然后两个集合中的元素一一对应

常用操作

1.8以前map操作

按照value排序

// Map的value值降序排序
    public static <K, V extends Comparable<? super V>> Map<K, V> sortDescend(Map<K, V> map) {
        List<Map.Entry<K, V>> list = new ArrayList<>(map.entrySet());
        Collections.sort(list, new Comparator<Map.Entry<K, V>>() {
            @Override
            public int compare(Map.Entry<K, V> o1, Map.Entry<K, V> o2) {
                int compare = (o1.getValue()).compareTo(o2.getValue());
                return -compare;
            }
        });
 
        Map<K, V> returnMap = new LinkedHashMap<K, V>();
        for (Map.Entry<K, V> entry : list) {
            returnMap.put(entry.getKey(), entry.getValue());
        }
        return returnMap;
    }
 
    // Map的value值升序排序
    public static <K, V extends Comparable<? super V>> Map<K, V> sortAscend(Map<K, V> map) {
        List<Map.Entry<K, V>> list = new ArrayList<Map.Entry<K, V>>(map.entrySet());
        Collections.sort(list, new Comparator<Map.Entry<K, V>>() {
            @Override
            public int compare(Map.Entry<K, V> o1, Map.Entry<K, V> o2) {
                int compare = (o1.getValue()).compareTo(o2.getValue());
                return compare;
            }
        });
 
        Map<K, V> returnMap = new LinkedHashMap<K, V>();
        for (Map.Entry<K, V> entry : list) {
            returnMap.put(entry.getKey(), entry.getValue());
        }
        return returnMap;
    }

  /**
     * 利用Collections.sort 对map排序
     */
    public void testSort(){
        List<Map.Entry<String, Integer>> res = new ArrayList();
        Map<String,Integer> map=new HashMap<>();
        for(Map.Entry<String, Integer> entry : map.entrySet()) {
            res.add(entry);
        }
        Collections.sort(res, new Comparator<Map.Entry<String, Integer>>(){
            public int compare(Map.Entry<String, Integer> e1, Map.Entry<String, Integer> e2) {
                if(e2.getValue() != e1.getValue()) {
                    return e1.getValue() - e2.getValue();
                } else {
                    return e1.getKey().compareTo(e2.getKey());
                }
            }
        });
    }

  // map截取
    public static <K, V extends Comparable<? super V>> Map<K, V> subMap(Map<K, V> map,int subN) {
        Map<K, V> returnMap = new LinkedHashMap<K, V>();
        int i=0;
        for (Map.Entry<K, V> entry : map.entrySet()) {
            if(++i>subN){
                break;
            }
            returnMap.put(entry.getKey(),entry.getValue());
        }
        return returnMap;
    }


按照key排序

 public static void main(String[] args) {
        TreeMap<Student2,String> treeMap = new TreeMap<>(new Comparator<Student2>() {
            @Override
            public int compare(Student2 o1, Student2 o2) {
                // 基本和key实现Comparable接口,重写compareTo方法一致
                // 升序排序就是这么写的
                if(o1.getAge() > o2.getAge()){
                    return 1;
                }else if(o1.getAge() < o2.getAge()){
                    return -1;
                }
                // 相等的时候不能返回0
                return o1.getAge();
            }
        });
        treeMap.put(new Student2("大哥",24),"大哥");
        treeMap.put(new Student2("二哥",23),"二哥");
        treeMap.put(new Student2("三哥",22),"三哥");
        treeMap.put(new Student2("四哥",21),"四哥");
        Set<Student2> studentSet = treeMap.keySet();
        for (Student2 student : studentSet) {
            System.out.println(student.toString());
        }
    }

1.8以后对map排序

import com.alibaba.fastjson.JSON;
import java.util.*;
import java.util.stream.Collectors;
 
/**
 * Hello world!
 *
 */
public class App {
    public static void main( String[] args ) {
        Map<String,Integer> mapRepeat = new HashMap<>();
        mapRepeat.put("aa", 1);
        mapRepeat.put("bb", 45);
        mapRepeat.put("cc", 32);
        mapRepeat.put("dd", 226);
        mapRepeat.put("ee", 16);
        mapRepeat.put("ff", 320);
        mapRepeat.put("gg", 99);
 
        // 1.8以后 使用lambda表达式和Stream处理
        // 1.对Map的value进行降序排序,并取前5个key
        List<String> mobileList = mapRepeat.entrySet().stream()
                .sorted((Map.Entry<String, Integer> e1, Map.Entry<String, Integer> e2) -> e2.getValue() - e1.getValue())
                .map(entry -> entry.getKey()).collect(Collectors.toList())
                .subList(0, 5);
        System.out.println(JSON.toJSONString(mobileList));
 
 
        // 2、正向对Map的value排序并将结果输出到LinkedHashMap
        final Map<String, Integer> sortedByCount1 = mapRepeat.entrySet()
                .stream()
                .sorted(Map.Entry.comparingByValue())
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
        System.out.println(JSON.toJSONString(sortedByCount1));
 
        // 3、反向 reversed对Map的value排序并将结果输出到LinkedHashMap
        final Map<String, Integer> sortedByCount2 = mapRepeat.entrySet()
                .stream()
                .sorted((Map.Entry.<String, Integer>comparingByValue().reversed()))
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
        System.out.println(JSON.toJSONString(sortedByCount2));
 
 
        // 4.正向 Comparator 对Map的value排序并将结果输出到LinkedHashMap
        final Map<String, Integer> sortedByCount3 = mapRepeat.entrySet()
                .stream()
                .sorted((e1, e2) -> e1.getValue().compareTo(e2.getValue()))
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
        System.out.println(JSON.toJSONString(sortedByCount3));
 
 
        //反向 Comparator 对Map的value排序并将结果输出到LinkedHashMap
        final Map<String, Integer> sortedByCount4 = mapRepeat.entrySet()
                .stream()
                .sorted((e1, e2) -> e2.getValue().compareTo(e1.getValue()))
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
        System.out.println(JSON.toJSONString(sortedByCount4));
 
        // 1.8以前
        List<Map.Entry<String, Integer>> list1 = new ArrayList<>();
        list1.addAll(mapRepeat.entrySet());
        Collections.sort(list1, new Comparator<Map.Entry<String, Integer>>() {
            @Override
            public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
                return o1.getValue() - o2.getValue();
            }
        });
        for (Map.Entry<String, Integer> entry : list1) {
            System.out.println("key:" + entry.getKey() + ",value:" + entry.getValue());
        }
    }
}

List操作

/**
 * 将一组数据固定分组,每组n个元素
 * @param source 要分组的数据源
 * @param n      每组n个元素
 * @param <T>
 * @return
 */
public static <T> List<List<T>> fixedGrouping(List<T> source, int n) {

    if (null == source || source.size() == 0 || n <= 0)
        return null;
    List<List<T>> result = new ArrayList<List<T>>();

    int sourceSize = source.size();
    int size = (source.size() / n) + 1;
    for (int i = 0; i < size; i++) {
        List<T> subset = new ArrayList<T>();
        for (int j = i * n; j < (i + 1) * n; j++) {
            if (j < sourceSize) {
                subset.add(source.get(j));
            }
        }
        result.add(subset);
    }
    return result;
}

/**
 * 将一组数据平均分成n组
 *
 * @param source 要分组的数据源
 * @param n      平均分成n组
 * @param <T>
 * @return
 */
public static <T> List<List<T>> averageAssign(List<T> source, int n) {
    List<List<T>> result = new ArrayList<List<T>>();
    int remainder = source.size() % n;  //(先计算出余数)
    int number = source.size() / n;  //然后是商
    int offset = 0;//偏移量
    for (int i = 0; i < n; i++) {
        List<T> value = null;
        if (remainder > 0) {
            value = source.subList(i * number + offset, (i + 1) * number + offset + 1);
            remainder--;
            offset++;
        } else {
            value = source.subList(i * number + offset, (i + 1) * number + offset);
        }
        result.add(value);
    }
    return result;
}

来源

Guava 中 Map 的骚操作 - Nihaorz - 博客园

Java中的Collections类(工具类)十二大常用方法总结 - 47号Gamer丶 - 博客园

Guava之Maps教程_梦想画家的博客-CSDN博客_guava map

JAVA 对Map里的value值进行排序(升序或者降序);_花伦同学ko的博客-CSDN博客_map value排序 JAVA实现数据等分,一个List分成多个List_越努力越幸福的博客-CSDN博客_list分成多个list

Java8 对Map(key/value)排序后取TopN_天~嘿的博客-CSDN博客_map取top5

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值