首页 > 其他分享 >String类型对象每个元素转换为List<Character>或List<String>

String类型对象每个元素转换为List<Character>或List<String>

时间:2024-10-09 21:49:39浏览次数:1  
标签:String chars 元素 List System char str

String str = "abc";

第一眼想到是通过String#toCharArray()转换为char[],然后再转换为List,尝试用Arrays.asList(T... a)

char[] chars = str.toCharArray();
List<char[]> list = Arrays.asList(chars);
System.out.println(list);

发现转换结果不符合预期,因为是原始类型数组,被识别为1个元素,导致转换后的list里仅1个元素,类型是char[]

用for循环来转换:

List<Character> characterList = new ArrayList<>();
for (char aChar : chars) {
    characterList.add(aChar); // 写法1
    // validList.add((Character) aChar); // 写法2
    // validList.add(Character.valueOf(aChar)); // 写法3
}

List<String> stringList = new ArrayList<>();
for (char aChar : chars) {
    stringList.add(String.valueOf(aChar));
}

这样能转换成功,但感觉写法不够简洁优雅。

经过学习和尝试,找到以下3种方法:

  1. 通过String#split("")处理后再转换
List<Character> characterList = Arrays.asList(str.split("")).stream().map(o -> o.charAt(0)).collect(Collectors.toList());
List<String> stringList = Arrays.stream(str.split("")).collect(Collectors.toList());
  1. 通过String#chars()处理后再转换
List<Character> characterList = str.chars().mapToObj(i -> (char) i).collect(Collectors.toList());
List<String> stringList = str.chars().mapToObj(i -> String.valueOf((char) i)).collect(Collectors.toList());
  1. 通过Guava提供的Chars.asList(char... backingArray)转换
List<Character> characterList = Chars.asList(str.toCharArray());
List<String> stringList = Chars.asList(str.toCharArray()).stream().map(o -> String.valueOf(o)).collect(Collectors.toList());

值得注意的是:

List<String> stringList = str.chars().mapToObj(i -> String.valueOf((char) i)).collect(Collectors.toList());

mapToObjString.valueOf前做了一个强制类型转换(char) i,否则得到的String是原字符ASCII码的整数数值。

测试代码:

List<String> tmpList1 = str.chars().mapToObj(i -> String.valueOf(i)).collect(Collectors.toList());
List<String> tmpList2 = str.chars().mapToObj(i -> String.valueOf((char) i)).collect(Collectors.toList());
// [97, 98, 99]
System.out.println(tmpList1);
// [a, b, c]
System.out.println(tmpList2);

完整demo代码如下:

import com.google.common.primitives.Chars;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author cdfive
 */
public class StringCharArrayConvertToListTest {

    public static void main(String[] args) {
        String str = "abc";

        char[] chars = str.toCharArray();
        List<char[]> invalidList = Arrays.asList(chars);
        System.out.println(invalidList);

        List<Character> validList = new ArrayList<>();
        for (char aChar : chars) {
            validList.add(aChar); // 写法1
//            validList.add((Character) aChar); // 写法2
//            validList.add(Character.valueOf(aChar)); // 写法3
        }
        System.out.println(validList);

        List<String> validStringList = new ArrayList<>();
        for (char aChar : chars) {
            validStringList.add(String.valueOf(aChar));
        }
        System.out.println(validStringList);

        System.out.println(StringUtils.center("分隔线", 50, "-"));

        List<Character> characterList1 = Arrays.asList(str.split("")).stream().map(o -> o.charAt(0)).collect(Collectors.toList());
        List<Character> characterList2 = str.chars().mapToObj(i -> (char) i).collect(Collectors.toList());
        List<Character> characterList3 = Chars.asList(str.toCharArray());
        System.out.println(characterList1);
        System.out.println(characterList2);
        System.out.println(characterList3);

        System.out.println(StringUtils.center("分隔线", 50, "-"));

        List<String> stringList1 = Arrays.stream(str.split("")).collect(Collectors.toList());
        List<String> stringList2 = str.chars().mapToObj(i -> String.valueOf((char) i)).collect(Collectors.toList());
        List<String> stringList3 = Chars.asList(str.toCharArray()).stream().map(o -> String.valueOf(o)).collect(Collectors.toList());
        System.out.println(stringList1);
        System.out.println(stringList2);
        System.out.println(stringList3);

        System.out.println(StringUtils.center("分隔线", 50, "-"));

        List<String> tmpList1 = str.chars().mapToObj(i -> String.valueOf(i)).collect(Collectors.toList());
        List<String> tmpList2 = str.chars().mapToObj(i -> String.valueOf((char) i)).collect(Collectors.toList());
        // [97, 98, 99]
        System.out.println(tmpList1);
        // [a, b, c]
        System.out.println(tmpList2);
    }
}

总结:

  • Arrays.asList(T... a)如果参数是原始类型数组,转换后的List里仅一个元素,该元素是原始数组类型

  • String的每个char元素转换为List<Character>List<Character>有多种方法,根据情况选择使用

  • String的每个char元素转换为List是为了方便对每个元素处理,如:排序、Stream流处理等

  • String#chars()里每个元素是int类型,转为String前需要强制转换为char类型,如String.valueOf((char) i)

标签:String,chars,元素,List,System,char,str
From: https://www.cnblogs.com/cdfive2018/p/18453677

相关文章

  • 链表Set_LinkList(建立)
    用单链保存集合元素,元素由键盘输入。输入以-1结束,将所建链表打印输出。链表结构如下图所示:提示:1.链表中数据元素为整型,typedef int ElemType;2.用结构体自定义链表结构Set_LinkList ;3.初始化链表函数init(),该函数可创建空链表L,返回L的头指针地址;4.链表插入结点函数......
  • iOS NSString 使用Copy修饰,而不使用Strong修饰
    其实老实讲,定义@property属性,“使用Copy修饰,而不是用Strong修饰”这句话也不完全正确.因为如果他们对接的是不可变字符串,那么无论使用哪个都一样.问题就出现在,如果他们对接的是可变字符串NSMutableString,那就得用copy定义两个NSString属性:@interfaceViewControll......
  • 【C++】string (STL)
    string介绍字符串是表示字符序列的类标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型(关于模板的更多信息,请参阅basic_s......
  • WPF中的ListBox怎么添加删除按钮并删除所在行
    直接上代码:第一步:创建测试类publicclassBeautifulGirl{publicstringName{get;set;}}第二步:创建viewmodel和数据源publicclassMainWindowVm{publicObservableCollection<BeautifulGirl>Girls{get;set;}......
  • 原生js元素拖动效果
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metahttp-equiv="X-UA-Compatible"content="IE=edge"/><metaname="viewport"content="w......
  • 后端list在前端实现分页的方法
    1.后端传来list的数据格式,前端进行分页,在调回方法中reduce方法进行数据分块处理//生成卡片数据constitems=this.listData;constchunkedArray=items.reduce((resultArray,item,index)=>{constchunkIndex=Math.floor(index/6); if(......
  • 【javascript 编程】Web前端之JavaScript动态添加类名的两种方法、区别、className、c
    通过className来添加或删除类名添加类名获取元素el.className="类名1类名2...";多个类名用空格隔开。移除类名获取元素名el.className="";直接等于一个空字符串即可删除类名。通过classList来添加或删除类名添加一个类名获取元素名el.classList.add("类名");。......
  • Java之String类
    目录初识String字符串比较相等字符串常量池理解字符串的不可变字符与字符串字符串常见操作字符串比较compareTo()函数的原码 字符串查找字符串替换字符串拆分字符串截取其它操作StringBuffer和StringBuilder面试题:请解释String、StringBuffer、StringBuilder......
  • C++ day04(友元 friend、运算符重载、String字符串)
    目录【1】友元friend1》概念2》友元函数 3》友元类 4》友元成员函数 【2】运算符重载1》概念2》友元函数运算符重载 ​编辑 3》成员函数运算符重载4》赋值运算符与类型转换运算符重载 5》注意事项【3】String字符串类【1】友元friend1》概念定义:......
  • 代码随想录算法训练营第三天|链表理论基础、203.移除链表元素、707.设计链表、206.反
    链表理论基础链表的类型单链表每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。链表的入口节点称为链表的头结点也就是head。双链表单链表中的指针域只能指向节点的下一个节点。双链表:每一个节点有......