For Loop, 如何迭代字母表?Java

17

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

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

            System.out.println(alphabet);
        }

我希望它打印出类似于以下内容的东西。

a

ab

abc

abcd

abcde...以此类推。这是如何实现的?


1
创建一个字符串变量并将它与当前字母连接起来... - Jorge Campos
6个回答

24
你需要将 char alphabet 添加到一个字符串中。
String output = "";

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

这对你应该有效 ;)


12
不要在循环中使用 String += String 的方式,而应该使用 StringBuilder。尽管这只是一个简单的不重要的循环,但从一开始就用正确的方式做,以便将其变成第二天性。 - Andreas
我发完帖子后大约2秒钟就进行了编辑,哈哈,响应速度真快。需要注意的一点是,output += alphabet 需要在 print 语句 System.out.println(output += alphabet); 内部。 - pewpew
1
我认为这不必在System.out中。你为什么这么想? - Stefan
1
@pewpew 当然,这样更短,但是“需要吗”?不需要。 - Andreas
好的,我看到你做了什么 ;) - pewpew
1
@pewpew 在所有的答案中,你接受了性能最差的答案。不过,我得承认它比其他答案写起来简单一些。幸好字母表中只有26个字母。 - Andreas

9

我会选择使用 StringBuffer 或者 StringBuilder。例如:

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:

String: 它是不可变的,所以当您对字符串进行任何修改时,它将创建新实例并会很快占用内存。

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

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

因此,更好的选择是StringBuilder阅读更多

使用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。” - Andreas
我已经在我的解决方案中添加了两个。 - Ambrish
StringBuffer是同步的,这使得它的速度较慢。除非你处于极为罕见的情况下,多个线程同时向同一个缓冲区追加内容,否则你不应该使用它。始终使用StringBuilder,养成这个习惯。我建议从答案中删除StringBuffer,以免误导任何新手Java开发者。 - Andreas
1
@Andreas,我不建议删除,我建议Ambrish应该澄清差异,这样OP就可以根据要求选择任何方法。 - singhakash
@Andreas 我已经添加了细节并提供了更好的解决方案:Java8。 - Ambrish
Java 8的流是一个不错的特性,但我不同意称其为“更好的解决方案”。对我来说,它实际上略微劣于传统方式,但我认为将其简单地称为“另一种”方法也可以。 - Andreas

5

我建议使用 StringBuilder 类:

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

你也可以使用char[]比使用StringBuilder稍微快一点,然而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(),所以响应时间恶劣,呈指数增长。

0
String s = "" ;  
for(char alphabet = 'a'; alphabet <='z'; alphabet ++ )
        {
            s = s.concat(String.valueOf(alphabet));
            System.out.println(s);
        }

我假设他会在那个for循环之外声明它:) 无论如何,我已经编辑了答案。 - Rahman
尽管这个回答在理论上可能回答了问题,但它并不是一个好的回答,因为它没有教会提问者。相反,它提供了一种替代的解决方案,没有解释。这通常会导致提问者没有学到东西,在类似的问题再次发生时返回提问新问题。您介意添加一些解释吗? - Vogel612

0

离题一下,使用Java 8IntStream就像这样简单:

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

0
实际上使用 IntStream.range,需要加上 +1 才能得到最后一个字母 Z。
因此,代码应该是:
StringBuilder sb = new StringBuilder();

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

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