在Java中将Char数组转换为List

问题描述 投票:0回答:11

任何人都可以帮助我并告诉我如何将

char
数组转换为列表,反之亦然。 我正在尝试编写一个程序,用户在其中输入一个字符串(例如
"Mike is good"
),并在输出中,每个空格都被
"%20"
替换(即
"Mike%20is%20good"
)。虽然这可以通过多种方式完成,但由于插入和删除在链表中需要 O(1) 时间,所以我想尝试使用链表。我正在寻找某种方法将
char
数组转换为列表,更新列表,然后将其转换回来。

public class apples
{
   public static void main(String args[])
   {
      Scanner input = new Scanner(System.in);
      StringBuffer sb = new StringBuffer(input.nextLine());

      String  s = sb.toString();
      char[] c = s.toCharArray();
      //LinkedList<char> l = new LinkedList<char>(Arrays.asList(c));
      /* giving error "Syntax error on token " char",
         Dimensions expected after this token"*/
    }
}

因此,在这个程序中,用户输入字符串,我将其存储在

StringBuffer
中,我首先将其转换为字符串,然后转换为
char
数组,但我无法获取列表
l 
来自
s

如果有人能告诉我将

char
数组转换为列表的正确方法,反之亦然,我将非常感激。

java list stringbuffer
11个回答
81
投票

在Java 8及以上版本中,您可以使用

String
的方法
chars()
:

myString.chars().mapToObj(c -> (char) c).collect(Collectors.toList());

如果您需要将

char[]
转换为
List<Character>
,您可以先从中创建一个
String
,然后应用上述解决方案。虽然它的可读性和美观度不是很高,但它会很短。


35
投票

因为 char 是原始类型,所以标准

Arrays.asList(char[])
不起作用。它将生成
List<char[]>
代替
List<Character>
...所以剩下的就是迭代数组,并用该数组中的数据填充新列表:

    public static void main(String[] args) {
    String s = "asdasdasda";
    char[] chars = s.toCharArray();

    //      List<Character> list = Arrays.asList(chars); // this does not compile,
    List<char[]> asList = Arrays.asList(chars); // because this DOES compile.

    List<Character> listC = new ArrayList<Character>();
    for (char c : chars) {
        listC.add(c);
    }
}

这就是将列表转换回数组的方法:

    Character[] array = listC.toArray(new Character[listC.size()]);




有趣的是为什么

List<char[]> asList = Arrays.asList(chars);
会这样做:
asList
可以采用数组或 vararg。在这种情况下,
char [] chars
被视为char[]
的单值可变参数!所以你也可以写类似 

List<char[]> asList = Arrays.asList(chars, new char[1]);

:)


17
投票
使用循环之外的另一种方法是使用

GuavaChars.asList() 方法。那么将字符串转换为字符链接列表的代码就是:

LinkedList<Character> characterList = new LinkedList<Character>(Chars.asList(string.toCharArray()));

或者,以更番石榴的方式:

LinkedList<Character> characterList = Lists.newLinkedList(Chars.asList(string.toCharArray()));

Guava 库包含很多好东西,因此值得将其包含在您的项目中。


7
投票
现在我将发布这个答案作为所有那些不允许使用任何库而只能使用 java 8 的力量的开发人员的另一个选项:)

char[] myCharArray = { 'H', 'e', 'l', 'l', 'o', '-', 'X', 'o', 'c', 'e' }; Stream<Character> myStreamOfCharacters = IntStream .range(0, myCharArray.length) .mapToObj(i -> myCharArray[i]); List<Character> myListOfCharacters = myStreamOfCharacters.collect(Collectors.toList()); myListOfCharacters.forEach(System.out::println);
    

2
投票
尝试 Java Streams。

List<Character> list = s.chars().mapToObj( c -> (char)c).collect(Collectors.toList());
泛型参数不能是原始类型。


1
投票
在 Java 中不能将泛型与原始类型一起使用,

为什么?

如果您确实想转换为列表并返回数组,那么 dantuch 的方法是正确的。

但是如果你只是想进行替换,有一些方法(即

java.lang.String

replaceAll)可以为你做到这一点

private static String replaceWhitespaces(String string, String replacement) { return string != null ? string.replaceAll("\\s", replacement) : null; }

你可以这样使用它:

StringBuffer s = new StringBuffer("Mike is good"); System.out.println(replaceWhitespaces(s.toString(), "%20"));

输出:

Mike%20is%20good
    

1
投票

所有操作都可以在java 8或以上版本中完成:

从给定字符串到字符数组

char[] characterArray = myString.toCharArray();

从给定的字符串中获取字符列表

ArrayList<Character> characterList = (ArrayList<Character>) myString.chars().mapToObj(c -> (char)c).collect(Collectors.toList());

从给定的字符串中获取字符集 注意:集合仅存储唯一值。因此,如果您只想从字符串中获取唯一字符,可以使用此方法。

HashSet<Character> abc = (HashSet<Character>) given.chars().mapToObj(c -> (char)c).collect(Collectors.toSet());

从给定字符串中获取特定范围内的字符: 获取unicode值大于118的字符。 https://symbl.cc/en/unicode-table/#basic-latin

字符的 ASCII 代码值 * a-z - 97 - 122 * A-Z - 65 - 90

given.chars().filter(a -> a > 118).mapToObj(c -> (char)c).forEach(a -> System.out.println(a));
它将返回字符:w,x,v,z

过滤器中的ascii值可以与字符一起玩。您可以对过滤器中的字符进行操作,然后您可以将它们收集到列表中或根据您的需要进行设置


0
投票
我想最简单的方法就是简单地迭代 char 数组并将每个元素添加到字符的 ArrayList 中,方法如下:

public ArrayList<Character> wordToList () { char[] brokenStr = "testing".toCharArray(); ArrayList<Character> result = new ArrayList<Character>(); for (char ch : brokenStr) { result.add(ch); } return result; }
    

0
投票
如果你确实想将 char[] 转换为 List,你可以使用 .chars() 将字符串转换为 IntStream,但你需要先将 char[] 转换为 String

List<Character> charlist = String.copyValueOf(arrChr) .chars() .mapToObj(i -> (char) i) .collect(Collectors.toList());
    

0
投票
尝试这个解决方案

List<Character> characterList = String.valueOf(chars).chars().mapToObj(i -> (char) i).toList();


    


-1
投票
List strList = Stream.of( s.toCharArray() ).map( String::valueOf ).collect( Collectors.toList() );

© www.soinside.com 2019 - 2024. All rights reserved.