在Java中将Char数组转换为List

时间:2013-03-23 18:45:52

标签: java list stringbuffer

任何人都可以帮助我并告诉如何将char数组转换为列表,反之亦然。 我正在尝试编写一个用户输入字符串的程序(例如"Mike is good"),在输出中,每个空格都被"%20"替换(I "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数组转换为列表的正确方法,反之亦然,我将非常感激。

9 个答案:

答案 0 :(得分:33)

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

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

如果您需要将char[]转换为List<Character>,您可以先从String创建<form data-abide> <div class="name-field"> <label>Your name <small>required</small> <input type="text" required pattern="[a-zA-Z]+"> </label> <small class="error">Name is required and must be a string.</small> </div> <div class="email-field"> <label>Email <small>required</small> <input type="email" required> </label> <small class="error">An email address is required.</small> </div> <input id="contactsubmit" class="button" type="submit" value="SEND" disabled> </form> ,然后应用上述解决方案。虽然它不会非常易读和漂亮,但它会很短。

答案 1 :(得分:18)

因为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可以采用数组或 vararg 。在这种情况下,char [] chars被视为单值vararg char[]!所以你也可以写一些像

这样的东西

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

答案 2 :(得分:12)

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

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

或者,以番石榴的方式:

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

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

答案 3 :(得分:3)

现在我将这个答案作为另一个选项发布给所有那些不允许使用任何lib但只有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);

答案 4 :(得分:1)

您不能在原始类型why?

的java中使用泛型

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

但是如果你只是想做替换,那里有一些方法(即java.lang.String的{​​{3}})可以为你做这个

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

答案 5 :(得分:0)

所有操作都可以在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值。您可以对过滤器中的字符进行操作,然后可以将其收集在列表中或根据需要进行设置

答案 6 :(得分:0)

我想最简单的方法是通过以下方式简单地遍历char数组并将每个元素添加到Characters的ArrayList中:

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

答案 7 :(得分:0)

列表构造函数是处理类型的另一种选择:

List filterList = Arrays.asList(jTextFieldFilterSet.getText().toCharArray());

答案 8 :(得分:0)

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