更好的生成包含字母表中所有字母的数组的方法

89

现在我正在做什么。

for (char c = 'a'; c <= 'z'; c++) {
    alphabet[c - 'a'] = c;
}

但是有没有更好的方法呢? 类似于Scala的'a' to 'z'


3
请问您能具体说明使用情况吗?您需要在哪里使用数组? - Rohit Jain
11
你所说的“更好”是什么意思?"abcdefghijklmnopqrstuvwxyz".toCharArray() 更好吗? - Pshemo
2
请注意,上述内容在某种程度上依赖于ASCII / Unicode中所有小写罗马字母是连续的这一事实,这在EBCDIC中不起作用。 - Hot Licks
3
我只是希望代码看起来更好看一些,性能并不是很重要。 - Stupid.Fat.Cat
6
哪个字母表?比你想象的要多得多。 - Raedwald
显示剩余5条评论
17个回答

228
我认为这样会更简洁,您不必处理减法和索引:
char[] alphabet = "abcdefghijklmnopqrstuvwxyz".toCharArray();

5
您可以根据需要轻松地添加其他字符。 - Hot Licks
2
啊,我想可能有更简洁的方法来完成它,而不需要一个个打出来或者使用循环。:( 我想我会选择这个方法。谢谢! - Stupid.Fat.Cat
@HunterMcMillen Java源代码文件确实是Unicode(因此,在字符串字面值中,这就是你拥有的,也是你能添加的全部内容)。 - Tom Blodget
1
@Thilo 可能是,但并不是所有用户都可能使用相同的字母表,所以你会陷入棘手的境地:“我们是否将所有字母表存储为常量?”或者“由于某些字母表非常庞大,我们甚至可以合理地这样做吗?” - Hunter McMillen
你如何确保没有遗漏任何字母?例如,当阅读/审核以下代码时? - Piotr Findeisen
显示剩余2条评论

58
char[] LowerCaseAlphabet = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};

char[] UpperCaseAlphabet = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};

34
我确实想要这个!感谢你帮助我复制粘贴 :) - Ranjith V
我也是。谢谢。 - Clio Tech

27

这个getAlphabet方法使用了与问题描述中相似的技术来生成任意语言的字母表。

定义任何语言的枚举,并调用getAlphabet

char[] armenianAlphabet = getAlphabet(LocaleLanguage.ARMENIAN);
char[] russianAlphabet = getAlphabet(LocaleLanguage.RUSSIAN);

// get uppercase alphabet 
char[] currentAlphabet = getAlphabet(true);
    
System.out.println(armenianAlphabet);
System.out.println(russianAlphabet);
System.out.println(currentAlphabet);

缁撴灉

I/System.out: 铡闸眨栅榨咋乍炸诈摘斋宅窄债寨瞻毡詹粘沾盏斩辗崭展蘸栈占战站湛謤謥謧謨謩謪謫

I/System.out: 邪斜胁谐写械卸蟹懈泄泻谢屑薪芯锌褉褋褌褍褎褏褑褔褕褖褗褘褜褝褞褟

I/System.out: ABCDEFGHIJKLMNOPQRSTUVWXYZ

private char[] getAlphabet() {
    return getAlphabet(false);
}

private char[] getAlphabet(boolean flagToUpperCase) {
    Locale locale = getResources().getConfiguration().locale;
    LocaleLanguage language = LocaleLanguage.getLocalLanguage(locale);
    return getAlphabet(language, flagToUpperCase);
}

private char[] getAlphabet(LocaleLanguage localeLanguage, boolean flagToUpperCase) {
    if (localeLanguage == null)
        localeLanguage = LocaleLanguage.ENGLISH;

    char firstLetter = localeLanguage.getFirstLetter();
    char lastLetter = localeLanguage.getLastLetter();
    int alphabetSize = lastLetter - firstLetter + 1;

    char[] alphabet = new char[alphabetSize];

    for (int index = 0; index < alphabetSize; index++) {
        alphabet[index] = (char) (index + firstLetter);
    }

    if (flagToUpperCase) {
        alphabet = new String(alphabet).toUpperCase().toCharArray();
    }

    return alphabet;
}

private enum LocaleLanguage {
    ARMENIAN(new Locale("hy"), 'ա', 'ֆ'),
    RUSSIAN(new Locale("ru"), 'а','я'),
    ENGLISH(new Locale("en"), 'a','z');

    private final Locale mLocale;
    private final char mFirstLetter;
    private final char mLastLetter;

    LocaleLanguage(Locale locale, char firstLetter, char lastLetter) {
        this.mLocale = locale;
        this.mFirstLetter = firstLetter;
        this.mLastLetter = lastLetter;
    }

    public Locale getLocale() {
        return mLocale;
    }

    public char getFirstLetter() {
        return mFirstLetter;
    }

    public char getLastLetter() {
        return mLastLetter;
    }

    public String getDisplayLanguage() {
        return getLocale().getDisplayLanguage();
    }

    public String getDisplayLanguage(LocaleLanguage locale) {
        return getLocale().getDisplayLanguage(locale.getLocale());
    }

    @Nullable
    public static LocaleLanguage getLocalLanguage(Locale locale) {
        if (locale == null)
            return LocaleLanguage.ENGLISH;

        for (LocaleLanguage localeLanguage : LocaleLanguage.values()) {
            if (localeLanguage.getLocale().getLanguage().equals(locale.getLanguage()))
                return localeLanguage;
        }

        return null;
    }
}

18

这是一个有趣的Unicode解决方案:

int charAmount = 'z' - 'a' + 1;

char[] alpha = new char[charAmount];
for(int i = 0; i < charAmount ; i++){
    alpha[i] = (char)('a' + i);
}

System.out.println(alpha); //abcdefghijklmnopqrstuvwxyz

这将生成字母表的小写版本。
如果您想要大写字母表,您可以在 ('a' + i) 处将 'a' 替换为 'A'。


2
char 保存 UTF-16 单元代码,其中一个或两个单元代码构成一个 Unicode 代码点。称其为 ASCII 会分散注意力。 - Tom Blodget
如果你也加上 ^ 或者至少加上 ~,我会点赞的。 - Piotr Findeisen
k 是多余的。只需使用 'a' + i - shmosel
你好。我更新了你的示例,消除了“魔法数字”(参见:什么是魔法数字,为什么不好?)。如果你不同意,请随时回滚我的编辑。 - Pshemo

17

在Java 8中使用Stream API,你可以这样做。

IntStream.rangeClosed('A', 'Z').mapToObj(var -> (char) var).forEach(System.out::println);

9

如果您正在使用Java 8

char[] charArray = IntStream.rangeClosed('A', 'Z')
    .mapToObj(c -> "" + (char) c).collect(Collectors.joining()).toCharArray();

1
嗯,是的 - 看起来使用流没有好的解决方案,因为没有CharStream。如果您添加一些说明,我甚至可能会点赞,尽管我不建议这种方法 - 它绝不比循环更好。 - Hulk
1
@Hulk:当然,但你可以返回一个 Stream<Character> CharStream = IntStream.rangeClosed('a', 'z').mapToObj(c -> (char) c);,并从那时起使用它。https://dev59.com/JWEh5IYBdhLWcg3waC5t - Klemen Tusar
@techouse 当然可以,但是原帖中要求的是char[] - 对于这种情况,使用流无法避免装箱和拆箱。 - Hulk

6
static String[] AlphabetWithDigits = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"};

4

使用 io.vavr

public static char[] alphanumericAlphabet() {
    return CharSeq
            .rangeClosed('0','9')
            .appendAll(CharSeq.rangeClosed('a','z'))
            .appendAll(CharSeq.rangeClosed('A','Z'))
            .toCharArray();
}

4

请检查一下,我确信你将得到从 az 的字母:

for (char c = 'a'; c <= 'z'; c++) {
    al.add(c);
}
System.out.println(al);'

3

对于正在寻找Kotlin解决方案的Android开发人员,最终到达这里:

// Creates List<Char>
val chars1 = ('a'..'z').toList()

// Creates Array<Char> (boxed)
val chars2 = ('a'..'z').toList().toTypedArray()

// Creates CharArray (unboxed)
val chars3 = CharArray(26) { 'a' + it }

// Creates CharArray (unboxed)
val chars4 = ('a'..'z').toArray()
fun CharRange.toArray() = CharArray(count()) { 'a' + it }

若要了解我所说的"boxed"和"unboxed"是什么,请参见这篇文章
非常感谢这个 Kotlin 讨论线程


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