【问题标题】:convert an array of char into several String [duplicate]将一个char数组转换为几个String [重复]
【发布时间】:2017-11-25 22:32:42
【问题描述】:

我需要将一个 char 数组转换成几行一定大小的行。例如,考虑这个数组:

char[] bases = new char[]{'a', 'c', 'c', 't', 'a', 'c', 'a', 't', 'a', 'c', 'c', 't', 'a', 'c', 'a', 't'};

预期的输出将是 5 的大小:

accta
catac
ctaca

我目前正在使用此代码:

    int ls = 5; 
    String str = ""; 
    for (int i = 1; i < bases.length; i++) {
        str += bases[i - 1];
        if (i%ls == 0) {
            str += '\n';
        }
    }

在 java 8 中是否有一些内置函数可以实现这一点?有没有更好的方法来解决这个问题?

【问题讨论】:

  • 一个 HTML 元素?这看起来更像 DNA。
  • 我不明白 HTML 与此有何关联。
  • new String(bases, 0, 5)new String(bases, 5, 10)
  • 抱歉忘记更新标题了,应该会更好
  • 几个字符串?还是一个字符串,每 5 个字符换行一次?

标签: java arrays string java-8


【解决方案1】:

您可以将 char[] 转换为字符串,然后您可以将 split 与一些正则表达式一起使用:

String s = String.valueOf(bases);//result = acctacatacctacat
System.out.println(Arrays.toString(s.split("(?<=\\G.{5})")));

如果你想在一行中完成:

String[] spl = String.valueOf(bases).split("(?<=\\G.{5})");

输出

[accta, catac, ctaca, t]

【讨论】:

    【解决方案2】:

    可能可以利用 substring() 来简化它。 (先把 char[] 转成字符串)

     int ls = 5; 
     for (int i = ls; i < bases.length; i+=ls)
         someList.append(bases.substring((i-ls, i)));
    

    【讨论】:

    • 小心:如果bases.length % ls != 0,这将无法正常工作。
    • 我相信它仍然可以工作,只是不会得到字符串末尾的剩余字符——在如何处理这些问题中没有指定这些字符——但他的例子只是删除了结束字符。
    • 如果ls == 5bases.length &lt;= 4,使用i == ls 作为子字符串的第二个参数会失败。
    • 如果设置了这些条件,for循环将不会进入第一次迭代,因为5 &lt; 4将返回false。
    • 啊,好的。所以,你没有得到一个例外,你只是错过了最后一个子字符串:)
    【解决方案3】:

    您几乎不应该在循环中使用字符串连接来构建字符串。

    使用StringBuilder

    StringBuilder sb = new StringBuilder(bases.length + (4 + bases.length) / 5);
    for (int i = 0; i < bases.length; i += 5) {
      sb.append(bases, i, Math.min(5, bases.length - i));
      sb.append("\n");
    }
    String str = sb.toString();
    

    【讨论】:

    • @YCF_L 啊,第三个参数是长度,不是结束索引。谢谢。 (令人困惑的是,append(CharSequence, int, int) 中的第三个参数是结束索引,而不是长度)。
    【解决方案4】:

    这可能是您使用 java8 Stream 功能的另一个解决方案:(为了理解起见,我将逐步留下答案,但稍后可以浓缩和简化/收集很多内容)

    int charsPerChunk = 5;
    char[] myCharArray = { 'H', 'e', 'l', 'l', 'o', '+', 'X', 'o', 'c', 'e', '!' };
    // turn the char array into a Stream of Characters
    Stream<Character> myStreamOfCharacters = IntStream.range(0, myCharArray.length).mapToObj(i -> myCharArray[i]);
    // collect that into a list of characters
    List<Character> myListOfCharacters = myStreamOfCharacters.collect(Collectors.toList());
    
    int size = myListOfCharacters.size();
    int fullChunks = (size - 1) / charsPerChunk;
    // get a stream of list of characters
    Stream<List<Character>> result = IntStream
              .range(0, fullChunks + 1)
              .mapToObj( x -> myListOfCharacters.subList(x * charsPerChunk, x == fullChunks ? size : (x + 1) * charsPerChunk));
    
    // print it
    result.forEach(System.out::println);
    

    【讨论】:

    • 我认为在这种情况下使用流是多余的。
    • 同意,特别是这部分....myStreamOfCharacters
    【解决方案5】:

    由于在这种情况下,您对编写所需的序列有一个非常清晰的概念,也许编写一个自定义代码来创建相应的char[] 将是最有效的:

       final int ls = 5;
       final char[] result = new char[bases.length + (bases.length + ls - 1) / ls]
       int nextIndex = 0;
       for (int i = 0; i < bases.length; i += ls) {
          final int size = bases.length - i >= ls ? ls : bases.length - i;
          System.arraycopy(bases, i, result, nextIndex, size);
          nextIndex += size;
          result[nextIndex++] = '\n'; 
       }
       final String resultAsString = new String(result);
    

    【讨论】:

    • 请注意,这会在bases[0] 之后插入第一个换行符,而不是在bases[ls-1] 之后。
    • @AndyTurner 太棒了!谢谢。
    • 我已更改代码以使用可能比 StringBuiler 更有效的自定义解决方案。
    猜你喜欢
    • 2012-11-19
    • 2013-09-10
    • 2012-10-31
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多