【问题标题】:Converting Char Array to List in Java在 Java 中将字符数组转换为列表
【发布时间】:2013-03-13 12:14:10
【问题描述】:

谁能帮助我,告诉我如何将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数组转换为列表的正确方法,我将不胜感激。

【问题讨论】:

  • 你不能为你的列表使用原始数据类型,你需要 Character intead。但是,您的方法不起作用,因此请使用例如ArrayUtils.toObject(char[]) 来自Apache Commons
  • 这里是Convert Char Array To String In Java的文章,这将帮助您回答您的问题

标签: java list stringbuffer


【解决方案1】:

因为 char 是原始类型,标准 Arrays.asList(char[]) 将不起作用。它将产生List&lt;char[]&gt; 代替List&lt;Character&gt; ...所以剩下的就是遍历数组,并用该数组中的数据填充新列表:

    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&lt;char[]&gt; asList = Arrays.asList(chars); 会这样做:asList 可以接受数组或 vararg。在这种情况下,char [] chars 被视为单值可变参数 char[]!所以你也可以写类似

List&lt;char[]&gt; asList = Arrays.asList(chars, new char[1]); :)

【讨论】:

  • List asList = Arrays.asList(chars); // 因为这确实编译。不,这不会编译:数组类型中的方法 asList(Object[]) 不适用于参数 (char[])
  • @PhilipJ 是的,确实如此。它在我的 Eclipse 中。如果您的 NOT - 提交错误报告。在给定的代码中,char[] 成为单个对象,而不是字符数组。这甚至写在我的回答中。
  • 谢谢。来自 C# 的 Java 看起来真的是一种耻辱。
【解决方案2】:

你不能在java中使用泛型和原始类型,why?

如果你真的想转成 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

【讨论】:

    【解决方案3】:

    使用循环之外的另一种方法是使用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 库包含很多好东西,因此值得将其包含在您的项目中。

    【讨论】:

    • @Cyrille Ka 我没有投反对票,但我猜这是因为您提供的答案无法编译(并且可能无法更正编译)。
    • @mbmast 据我所知,我刚刚尝试过,这两个示例都可以在 Java 5 到 8 上编译,前提是“string”是先前初始化的 String 类型的变量,并且 Guava 依赖项包含在该项目。如果在您的机器上失败,请告诉我编译器错误。
    • 亲爱的 Cyrille - 请注意一个事实。 LinkedList 仅适用于特殊情况。除非您真的需要它,否则请改用 ArrayList ..
    • 具有类型变量的列表可以解决这个问题:List filterList = Arrays.asList(jTextFieldFilterSet.getText().toCharArray());
    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案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);
      

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          我想最简单的方法是通过简单地迭代 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;
          }
          

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-02-11
              • 1970-01-01
              • 1970-01-01
              • 2011-02-06
              • 2012-04-17
              • 2012-10-20
              • 2017-02-13
              相关资源
              最近更新 更多