35

谁能帮助我并告诉我如何将char数组转换为列表,反之亦然。我正在尝试编写一个程序,用户在其中输入一个字符串(例如"Mike is good"),并且在输出中,每个空格都被替换为"%20"(Ie "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"*/
    }
}

所以在这个程序中,用户正在输入字符串,我将其存储在 aStringBuffer中,我首先将其转换为字符串,然后转换为char数组,但我无法从中获取l列表s

如果有人能告诉我将char数组转换为列表的正确方法,我将不胜感激,反之亦然。

4

8 回答 8

67

在 Java 8 及更高版本中,您可以使用String' 方法chars()

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

如果您需要转换char[]List<Character>,您可以String先从中创建一个,然后应用上述解决方案。虽然它不会非常可读和漂亮,但它会很短。

于 2015-12-02T23:45:18.243 回答
33

因为 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);
    }
}

这就是将 List 转换回数组的方式:

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




有趣的是它为什么List<char[]> asList = Arrays.asList(chars);这样做:asList可以采用 array 或vararg。在这种情况下char [] chars被认为是单值可变参数 char[]!所以你也可以写类似

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

于 2013-03-23T19:07:29.940 回答
17

使用循环的另一种方法是使用GuavaChars.asList()方法。然后将字符串转换为字符的 LinkedList 的代码就是:

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

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

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

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

于 2013-10-21T15:03:22.717 回答
5

现在我将把这个答案作为另一个选项发布给那些不允许使用任何库但只允许使用 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);
于 2017-06-22T15:23:26.293 回答
1

您不能在 Java 中将泛型与原始类型一起使用,为什么?

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

但是,如果您只想进行替换,则有一些方法(即replaceAlljava.lang.String)可以为您完成

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
于 2013-03-23T19:18:09.740 回答
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://unicode-table.com/en/#basic-latin

字符的 ASCII 码值 * az - 97 - 122 * AZ - 65 - 90

 given.chars().filter(a -> a > 118).mapToObj(c -> (char)c).forEach(a -> System.out.println(a));

它将返回字符:w,x,v,z

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

于 2019-08-21T04:23:16.477 回答
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;
}
于 2019-08-25T02:11:31.410 回答
0

列表 strList = Stream.of(s.toCharArray()).map(String::valueOf).collect(Collectors.toList());

于 2021-05-30T09:48:13.187 回答