首页 > 编程语言 >Java中常见转换-数组与list互转、驼峰下划线互转、Map转Map、List转Map、进制转换的多种方式

Java中常见转换-数组与list互转、驼峰下划线互转、Map转Map、List转Map、进制转换的多种方式

时间:2023-05-31 14:33:49浏览次数:49  
标签:Map 转换 String list System println 互转 out

场景

Java中数组与List互转的几种方式

数组转List

1、最简单的方式,Arrays.asList(array); 创建的是不可变列表,不能删除和新增元素

        String[] array = new String[]{"a","b"};
        List<String> stringList = Arrays.asList(array);
        System.out.println(stringList);//[a, b]

但是如果修改为如下

        String[] arrayA = new String[]{"a","b"};
        List<String> stringListA = Arrays.asList(arrayA);
//        System.out.println(stringListA);
//        stringListA.add("c");
//        System.out.println(stringListA);

运行直接抛出异常Exception in thread "main" java.lang.UnsupportedOperationException
这是因为通过Arrays.asList创建的List,虽然命名也是ArrayList,但是全路径为java.util.Arrays.ArrayList
不支持add,remove操作,但是可以更新列表中元素的值。

 

不支持add,remove操作,但是可以更新列表中元素的值。

        stringListA.set(1,"c");
        System.out.println(stringListA);

2、如果需要对转换后的list进行操作,可以用以下方式

        String[] arrayB = new String[]{"a","b"};
        ArrayList<String> strings = new ArrayList<>(Arrays.asList(arrayB));
        strings.add("c");
        System.out.println(strings);//[a, b, c]

相当于用列表创建列表,属于深拷贝的一种表现,获得的列表支持新增、删除

3、第三种借助于jdk提供的容器工具类Collections来实现-推荐写法

        String[] arrayC = new String[]{"a","b"};
        //创建列表,并指定长度,避免可能产生的扩容
        List<String> list= new ArrayList<>(arrayC.length);
        //实现数组添加到列表中
        Collections.addAll(list,arrayC);
        //因为列表为我们定义的ArrayList,所以可以对它进行增删改
        list.add("c");
        System.out.println(list);

列表转数组

列表转数组,直接调用List.toArray

        List<String> listA = Arrays.asList("a","b","c");
        //返回的是Object[]数组
        Object[] objects = listA.toArray();
        //如果需要指定数组类型,可以传一个指定各类型的空的数组
        String[] strings1 = listA.toArray(new String[]{});

Java中驼峰与下划线互转

1、使用guava

        //驼峰转下划线
        String baDao = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, "baDao");
        System.out.println(baDao);
        //下划线转驼峰
        String ba_dao = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, "ba_dao");
        System.out.println(ba_dao);

2、使用Hutool工具类

        String ba_dao1 = StrUtil.toCamelCase("ba_Dao");
        System.out.println(ba_dao1);
        String baDao1 = StrUtil.toUnderlineCase("baDao");
        System.out.println(baDao1);

Java中Map转换Map的几种方式

比如希望将一个Map<String,Integer>转换成Map<String,String>

首先提供一个创建Map的公共方法newMap

    private static <T> Map<String,T> newMap(String key,T val,Object... kv){
        Map<String,T> ans = new HashMap<>(8);
        ans.put(key,val);
        for (int i = 0,size = kv.length; i < size; i+=2) {
            ans.put(String.valueOf(kv[i]),(T)kv[i+1]);
        }
        return ans;
    }

1、基本的for循环转换

        Map<String, Integer> map = newMap("k", 1, "a", 2, "b", 3);
        HashMap<String,String> ans = new HashMap<>(map.size());
        for (Map.Entry<String,Integer> entry:map.entrySet()) {
            ans.put(entry.getKey(),String.valueOf(entry.getValue()));
        }
        System.out.println(ans);

2、容器的流式使用

        Map<String, Integer> map1 = newMap("k", 1, "a", 2, "b", 3);
        Map<String, String> collect = map1.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, s -> String.valueOf(s.getValue())));
        System.out.println(collect);

3、Guava的transform方式

        Map<String, Integer> map2 = newMap("k", 1, "a", 2, "b", 3);
        Map<String, String> stringStringMap = Maps.transformValues(map2, String::valueOf);
        System.out.println(stringStringMap);

Java中List转Map的几种方式

如何将List转为Map<Object,List<Object>>

1、基本写法

        List<String> list = new ArrayList<String>(){{
            add("badao");
            add("de");
            add("cheng");
            add("xv");
            add("yuan");
        }};
        Map<Integer,List<String>> ans = new HashMap<>();
        for (String str:list) {
            List<String> sub = ans.get(str.length());
            if(sub == null){
                sub = new ArrayList<>();
                ans.put(str.length(),sub);
            }
            sub.add(str);
        }
        System.out.println(ans);

2、对于jdk8,上面for循环的内容可以利用Map.computeIfAbsent来替换

computeIfAbsent:如果key对应的value不存在,则使用获取 mappingFunction 计算后的值,

并保存为该 key 的 value,否则返回 value。

        Map<Integer,List<String>> ans2 = new HashMap<>();
        for (String str:list) {
            ans2.computeIfAbsent(str.length(),k->new ArrayList<>()).add(str);
        }
        System.out.println(ans2);

3、在jdk8中借助stream的流处理,可以将上面更一步进行简化

        Map<Integer, List<String>> collect = list.stream().collect(Collectors.groupingBy(String::length));
        System.out.println(collect);

4、上面是针对特定的列表,针对业务进行开发转换,下面构建一个通用的工具类toMapList

    /**
     * List<V> 转换成Map<K,List<V>>  特点在于Map中的value是个列表,且列表中的元素就是从原列表中的元素获取
     * @param list
     * @param func
     * @param <K>
     * @param <V>
     * @return
     */
    public static <K,V> Map<K,List<V>> toMapList(List<V> list, Function<V,K> func){
        return list.stream().collect(Collectors.groupingBy(func));
    }

对应的调用可以改为

        Map<Integer, List<String>> integerListMap = toMapList(list, String::length);
        System.out.println(integerListMap);
        //{2=[de, xv], 4=[yuan], 5=[badao, cheng]}

5、如果希望对value也做处理,可以修改工具类

    /**
     * List<I> 转换成Map<K,List<V>> 特点在于Map中的value是个列表,且列表中的元素是由list.item转换而来
     * @param list
     * @param keyFunc
     * @param valFunc
     * @param <K>
     * @param <I>
     * @param <V>
     * @return
     */
    public static <K,I,V> Map<K,List<V>> toMapList(List<I> list,Function<I,K> keyFunc,Function<I,V> valFunc){
        return list.stream().collect(Collectors.groupingBy(keyFunc,Collectors.mapping(valFunc,Collectors.toList())));
    }

调用示例

        Map<Integer, List<String>> integerListMap1 = toMapList(list, String::length, String::toUpperCase);
        System.out.println(integerListMap1);
        //{2=[DE, XV], 4=[YUAN], 5=[BADAO, CHENG]}

6、guava工具包中提供了一个HashMultimap的工具类,它的使用和平常的map的区别是,它的value是个集合

        HashMultimap<Integer, String> map = HashMultimap.create();
        for (String str:list) {
            map.put(str.length(),str);
        }
        System.out.println(map);
        //{2=[de, xv], 4=[yuan], 5=[badao, cheng]}

Java中进行进制转换的几种方式

1、toString实现进制转换

Integer/Long toString(int i,int radix)可以将任一进制的整数,转换为其他任意进制的整数
第一个参数:待转换的数字
第二个参数:转换后的进制位

        //十六进制转十进制
        System.out.println(Integer.toString(0x12, 10));
        //八进制转十进制
        System.out.println(Integer.toString(012,10));
        //八进制转二进制
        System.out.println(Integer.toString(012,2));

2、除了使用上面的方式,还可直接使用toBinaryString来实现转二进制

        //十进制转二进制
        System.out.println(Integer.toBinaryString(2));
        //十进制转八进制
        System.out.println(Integer.toOctalString(9));
        //十进制转十六进制
        System.out.println(Integer.toHexString(10));

 

标签:Map,转换,String,list,System,println,互转,out
From: https://www.cnblogs.com/badaoliumangqizhi/p/17446014.html

相关文章

  • C/C++杂记:运行时类型识别(RTTI)与动态类型转换原理
    运行时类型识别(RTTI)的引入有三个作用:配合typeid操作符的实现;实现异常处理中catch的匹配过程;实现动态类型转换dynamic_cast。1.typeid操作符的实现1.1.静态类型的情形C++中支持使用typeid关键字获取对象类型信息,它的返回值类型是conststd::type_info&,例:#include<type......
  • sqlmap的使用 ----常用tamper模块,TODO,绕过WAF的测试
    sqlmap的使用----自带绕过脚本tamperwkend2018-09-1520:23:39sqlmap在默认的的情况下除了使用char()函数防止出现单引号,没有对注入的数据进行修改,还可以使用–tamper参数对数据做修改来绕过waf等设备。0x01命令如下sqlmap-u[url]--tamper[模块名]sqlmap的绕过脚本在目录u......
  • nmap -A 启用操作系统和版本检测,脚本扫描和路由跟踪功能
    nmap-Axx.xx.IP.xxStartingNmap7.91(https://nmap.org)at2021-08-1810:13CSTNmapscanreportfor39.108.15.161Hostisup(0.075slatency).Notshown:989filteredportsPORTSTATESERVICEVERSION22/tcpopensshOpenSSH......
  • linux 中sed命令实现文本的大小写转换
     001、将所有的小写字母转换为大写[root@PC1test4]#lsa.txt[root@PC1test4]#cata.txt##测试数据abdmnjuyrXDETHRQYEcvbDdggyi[root@PC1test4]#sed's/[a-z]/\U&/g'a.txt##所有小写字母转换为大写ABDMNJUYRXDETHRQYECVB......
  • Scala之柯里化和隐式转换
    1.柯里化柯里化指将原来接受两个参数的函数变成一个新的接受一个参数的过程。新的函数返回一个以原有第二个参数作为参数的函数。scala>valmul=(x:Int,y:Int)=>x*ymul:(Int,Int)=>Int=<function2>scala>valmulOneAtTime=(x:Int)=>((y:Int)=>x*y)//......
  • 如何快速将无损音频WMA格式转换为MP3
    许多人都知道WMA音频格式,但是对WMA这种格式特点可能就不怎么了解了。其实WMA是微软推出的一种和MP3齐名的音频格式,但是WMA在压缩比和音质方面都超过了MP3。不过相比于这两种音频格式,我们最为常用的似乎还是MP3格式。今天我们就来讨论一下,如果我们遇到需要将wma格式转换为MP3格......
  • 如何截取电影画面转换成gif动图做微信表情包
    现在越来越多的GIF动态图片了,层出不穷的在更新,就像在QQ、微信里聊天,都会看到很多不同的好笑有趣的GIF图片,那么除了网上别人制作的GIF图片,我们自己也能够制作。截取电影或电视剧某几秒画面转换成GIF动图,然后发到微信上,做成微信表情包,就可以随时随地分享给好友了。由于表情包一般......
  • 【python教程】map、多进程与进度条
    转载:【python教程】map、多进程与进度条-知乎(zhihu.com)今天讲讲我在实习中学到的一点python知识,核心内容是多进程,也即我们常说的并行计算。map首先提个问题,给出一个列表,对列表中的每个元素都平方,代码怎么写?最简单直观的方法自然就是for循环。alist=[1,2,3,4,5,6,......
  • OpenCV 和 TensorRT 之间的数据转换 HWC to CHW
    TensorRT做图像相关模型部署的时候,导入图片的数据存储往往是BHWC(Batch,Height,Width,Channel),而TensorRT推理的时候是BCHW.OpenCV和TensorRT之间的数据转换(BHWCtoBCHW),一般是所有元素遍历赋值:cv::Matorigin_image=cv::imread("test.jpg",1);if(!orig......
  • 中缀表达式转换为后缀表达式
    中缀表达式转换为后缀表达式所谓中缀表达式,指的是运算符处于操作数的中间(例:3*(4+2)),中缀表达式是人们常用的算术表示方法,但中缀表达式不容易被计算机解析,因为既要考虑运算符的优先级,还要考虑括号的处理。但中缀表达式仍被许多程序语言使用,因为它符合人们的普遍用法。后缀表达......