在Java中将字符数组转换为列表

39

有人能帮我,告诉我如何将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数组,但我无法从s获取列表l

如果有人能告诉我正确的将char数组转换为列表以及反过来的方法,我将非常感激。


2
你不能使用原始数据类型作为List,需要使用Character。然而,你的方法行不通,所以最好使用例如Apache Commons中的ArrayUtils.toObject(char[])。 - s106mo
这是一篇关于在Java中将字符数组转换为字符串的文章,阅读它可以帮助您回答问题。**Convert Char Array To String In Java** - Rahul Gupta
11个回答

81

在Java 8及以上版本中,您可以使用Stringchars()方法:

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

以下是将List转换为数组的方法:

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




有趣的是为什么List<char[]> asList = Arrays.asList(chars);会做它所做的事情:asList可以接收数组或可变参数。在这种情况下,char [] chars被视为char[]单值可变参数!因此,您还可以编写类似于

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


List<char[]> asList = Arrays.asList(chars); // 因为这个是可以编译的。 不,这个不能编译:类型 Arrays 中的方法 asList(Object[]) 对于参数 (char[]) 不适用。 - Philip Puthenvila
@PhilipJ 是的,它可以。在我的Eclipse中是可以的。如果在你的Eclipse中不行,请提交一个错误报告。在给定的代码中,char[]变成了单个对象,而不是字符数组。这甚至在我的答案中都有写明。 - dantuch
谢谢。从C#来看,Java真的很令人失望。 - alelom

17

除了使用循环外,另一种方法是使用GuavaChars.asList()方法。然后将字符串转换为字符链表的代码只需:

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

或者,以更Guava的方式:

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

Guava库包含了很多好东西,因此在项目中引入它是值得的。


@Cyrille Ka 我没有给你的回答点踩,但我猜测原因是你提供的答案无法编译(并且可能无法被修正为可编译状态)。 - mbmast
据我所知,我刚试过,两个示例都可以在Java 5到8上编译,前提是“string”是先前初始化的String类型变量,并且Guava依赖项已包含在项目中。如果在您的计算机上失败,请告诉我编译器错误。 - Cyrille Ka
亲爱的Cyrille-请注意一件事。LinkedList只是针对特殊情况的。除非你真的需要它,否则请使用ArrayList。 - Polostor
带有类型变量的列表可以解决这个问题:List filterList = Arrays.asList(jTextFieldFilterSet.getText().toCharArray()); - Jaja

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);

甚至可以跳过一步 :) 变量列表 = IntStream .range(0, myCharArray.length) .mapToObj(i -> myCharArray[i]) .collect(Collectors.toList): list.forEach(System.out::println); - Gulbala Salamov

1

尝试使用Java Streams。

List<Character> list = s.chars().mapToObj( c -> (char)c).collect(Collectors.toList());

泛型参数不能是原始类型。


1

在Java中,您无法使用泛型与基本类型一起使用,为什么?

如果您真的想将其转换为List并返回到数组,则dantuch的方法是正确的。

但是,如果您只想进行替换,则有一些方法(即java.lang.StringreplaceAll)可以为您完成此操作。

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://unicode-table.com/en/#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
尝试这个解决方案: List<Character> characterList = String.valueOf(chars).chars().mapToObj(i -> (char) i).toList();

0
如果你真的想把char[]转换成List,你可以使用.chars()将字符串转换为IntStream,但是你需要先将char[]转换为String。
List<Character> charlist = String.copyValueOf(arrChr)
    .chars()
    .mapToObj(i -> (char) i)
    .collect(Collectors.toList());

0
我想最简单的方法是通过迭代字符数组并将每个元素添加到字符ArrayList中,如下所示:
public ArrayList<Character> wordToList () {
    char[] brokenStr = "testing".toCharArray();
    ArrayList<Character> result = new ArrayList<Character>();
    for (char ch : brokenStr) {
        result.add(ch);
    }
    return result;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接