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

现在我正在做

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

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

332283 次浏览

我认为这样会更干净一些,你不必处理减法和索引:

char[] alphabet = "abcdefghijklmnopqrstuvwxyz".toCharArray();
char[] alphabet = {'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'};
for (char letter = 'a'; letter <= 'z'; letter++)
{
System.out.println(letter);
}

这是一个有趣的 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”。

import java.util.*;
public class Experiments{




List uptoChar(int i){
char c='a';
List list = new LinkedList();
for(;;) {
list.add(c);
if(list.size()==i){
break;
}
c++;
}
return list;
}


public static void main (String [] args) {


Experiments experiments = new Experiments();
System.out.println(experiments.uptoChar(26));
}

检查这一次,我确信你会得到 az字母:

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

如果你使用的是 Java8

char[] charArray = IntStream.rangeClosed('A', 'Z')
.mapToObj(c -> "" + (char) c).collect(Collectors.joining()).toCharArray();
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"};

这个 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: ISO基础拉丁字母表

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;
}
}
char[] abc = new char[26];


for(int i = 0; i<26;i++) {
abc[i] = (char)('a'+i);
}

在带有 StreamAPI 的 Java8中,您可以这样做。

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

我爱你

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

使用 Java8流

  char [] alphabets = Stream.iterate('a' , x -> (char)(x + 1))
.limit(26)
.map(c -> c.toString())
.reduce("", (u , v) -> u + v).toCharArray();

以下是一些基于 @ Tom Thomas回答的替代方案。

人物数组:

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

字符串数组:

注意: 如果分隔符也是其中一个值,则不能正常工作。

String[] list = IntStream.concat(
IntStream.rangeClosed('0', '9'),
IntStream.rangeClosed('A', 'Z')
).mapToObj(c -> (char) c+",").collect(Collectors.joining()).split(",");

字符串列表:

注意: 如果分隔符也是其中一个值,则不能正常工作。

List<String> list = Arrays.asList(IntStream.concat(
IntStream.rangeClosed('0', '9'),
IntStream.rangeClosed('A', 'Z')
).mapToObj(c -> (char) c+",").collect(Collectors.joining()).split(","));

除了小写字母外,还可以得到大写字母:

String alphabetWithUpper = "abcdefghijklmnopqrstuvwxyz" + "abcdefghijklmnopqrstuvwxyz".toUpperCase();
char[] letters = alphabetWithUpper.toCharArray();

对于正在寻找 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 }

要了解我所说的“盒装”和“未盒装”是什么意思,请参阅 这篇文章
非常感谢 这个科特林的讨论话题

var alphabet = IntStream.rangeClosed('a', 'z')
.boxed()
.map(Character::toChars)
.map(String::valueOf)
.toList();

笔记

  • 为了使它包含 'z'
  • 以便从 IntStream创建列表
  • toList()创建了一个不可修改的列表,但显然只是 从 Java16开始