【问题标题】:for loop, iteration through alphabet? javafor循环,通过字母表迭代?爪哇
【发布时间】:2016-01-14 18:43:18
【问题描述】:

我可以遍历字母表,但我试图保留最后一次迭代并添加下一个字母。 这是我的代码。

for(char alphabet = 'a'; alphabet <='z'; alphabet ++ )
        {

            System.out.println(alphabet);
        }

我希望它打印出像这样的东西。

一个

ab

abc

abcd

abcde.....等等。这怎么可能?

【问题讨论】:

  • 创建一个字符串变量并将其与当前字母连接...

标签: java loops for-loop iteration alphabet


【解决方案1】:

您需要将char alphabet 添加到字符串中。

String output = "";

for(char alphabet = 'a'; alphabet <='z'; alphabet++ )
    {
        output += alphabet;
        System.out.println(output);
    }

这应该适合你;)

【讨论】:

  • 永远不要在循环中使用String += String。使用StringBuilder。当然,这是一个无关紧要的小循环,但要以正确的方式开始,所以它会成为第二天性。
  • 我在发布后 2 秒编辑了大声笑!这么快的响应时间哈哈。需要注意的一件事。输出 += 字母表需要在打印语句内 System.out.println(output += alphabet);
  • 我不认为必须在 System.out 中。你为什么这么认为?
  • @pewpew 当然更短,但“需要”?没有。
  • @pewpew 在所有答案中,您接受所有答案中表现最差的那个。它比其他的要简单一些,我会告诉你的。幸好字母表中只有 26 个字母。
【解决方案2】:

我会选择StringBufferStringBuilder。比如:

StringBuffer

StringBuffer sb = new StringBuffer();
for (char alphabet = 'a'; alphabet <= 'z'; alphabet++) {
    sb.append(alphabet);
    System.out.println(sb.toString());
}

StringBuilder

StringBuilder sb = new StringBuilder();
for (char alphabet = 'a'; alphabet <= 'z'; alphabet++) {
    sb.append(alphabet);
    System.out.println(sb.toString());
}

String vs StringBuffer vs StringBuilder

字符串:它是不可变的,所以当你对字符串进行任何修改时,它会创建新的实例,并且会太快耗尽内存。

StringBuffer:您可以使用它来创建动态字符串,同时那里只有 1 个对象,因此使用的内存非常少。它是同步的(这使它变慢了)。

StringBuilder:类似于StringBuffer。唯一的区别是:它不同步,因此速度更快。

所以,更好的选择是 StringBuilderRead more.

使用Java 8

StringBuilder sb = new StringBuilder();

IntStream.range('a', 'z').forEach(i -> {
    sb.append((char) i);
    System.out.println(sb.toString());
});

【讨论】:

  • StringBuffer 已过时。使用StringBuilder。引用javadoc“从 JDK 5 开始,StringBuffer 已经补充了一个专为单线程使用而设计的等效类 StringBuilder。”
  • 我在我的解决方案中都添加了。
  • StringBuffer 是同步的,这使它变慢。除非您处于极其罕见的情况,即多个线程附加到同一个缓冲区,否则您永远不应该使用它。始终使用StringBuilder。让它成为一种习惯。我建议从答案中删除 StringBuffer,以免误导任何来到这里的新手 Java 开发人员。
  • @Andreas 我不建议删除我建议 Ambrish 应该澄清差异,以便 OP 可以选择任何符合要求的方法
  • @Andreas 我添加了细节和更好的解决方案:Java8。
【解决方案3】:

我建议使用StringBuilder:

// Using StringBuilder
StringBuilder buf = new StringBuilder();
for (char c = 'a'; c <= 'z'; c++)
    System.out.println(buf.append(c).toString());

您也可以使用char[] 稍微快一点,但是StringBuilder 更明显且更易于使用:

// Using char[]
char[] arr = new char[26];
for (int i = 0; i < 26; i++) {
    arr[i] = (char)('a' + i);
    System.out.println(new String(arr, 0, i + 1));
}

你不应该使用的替代品:

  • StringBuffer:与StringBuilder 相同,但同步,所以更慢。
  • s = s.concat(new String(c)):每次迭代分配 2 个字符串,而不是只分配 1 个。
  • s += c:在内部,+= 编译为 s = new StringBuilder().append(s).append(c).toString(),响应时间非常慢,指数

【讨论】:

    【解决方案4】:
    String s = "" ;  
    for(char alphabet = 'a'; alphabet <='z'; alphabet ++ )
            {
                s = s.concat(String.valueOf(alphabet));
                System.out.println(s);
            }
    

    【讨论】:

    • 我假设他会在 for 循环之外声明它:)。无论如何编辑了答案
    • 虽然这在理论上可以回答这个问题,但这并不是一个很好的答案,因为它不教 OP。相反,它给出了一个替代解决方案,没有解释。这通常会导致 OP 不学习,并在出现类似问题时回来提出新问题。您介意添加一些解释吗?
    【解决方案5】:

    题外话,使用Java 8 IntStream 就这么简单:

     StringBuilder builder = new StringBuilder("");
     "abcdefghijklmnopqrstuvwxyz".chars().mapToObj(i -> builder.append((char) i))
          .forEach(System.out::println);
    

    用法:

     public class AlphabetsLooping {
        static final String input = "abcdefghijklmnopqrstuvwxyz";
    
        public static void main(String[] args) {
    
        StringBuilder builder = new StringBuilder("");
        input.chars().mapToObj(i -> builder.append((char) i))
                .forEach(System.out::println);
      } 
    }
    

    【讨论】:

      【解决方案6】:

      其实用IntStream.range 您需要添加 +1 最后一个字母 Z

      原来如此

      StringBuilder sb = new StringBuilder();
      
      IntStream.range('a', 'z'+1).forEach(i -> {
          sb.append((char) i);
          System.out.println(sb.toString());
      });
      

      【讨论】:

        猜你喜欢
        • 2023-02-23
        • 2014-08-08
        • 2018-05-20
        • 2018-09-02
        • 2018-05-24
        • 2013-03-23
        • 2011-11-02
        • 1970-01-01
        • 2021-08-23
        相关资源
        最近更新 更多