我很久以前没有开始编程,目前我需要一个方法来生成一个数组,其中包含一个字符,该字符位于前一个字符之后。它应该以0处的'A'开头,然后是'1'处的B等。困难的部分是在'Z'之后'AA'。
我想出了什么:
public static String[] charArray(int length)
{
String[] res = new String[length];
for(int i = 0; i < length; i++)
{
String name = "";
int colNumber = i;
while(colNumber > 0)
{
char c = (char) ('A' + (colNumber % 26));
name = c + name;
colNumber = colNumber / 26;
}
res[i] = name;
}
return res;
}
这适用于字母表的前26个字母,但它产生“...... Y,Z,BA,BB,BC ......”而不是“...... Y,Z,AA,AB,AC ......“
怎么了?或者有更有效或更简单的方法吗?
提前致谢!
答案 0 :(得分:4)
你有一个愉快的开始。此示例基本上不是通过while循环运行,而是根据数字%26
计算C的值然后将字母添加(连接)到位于(index / 26) - 1
位置的数组中的值,以确保它跟上随时间的变化。
在第一次进行迭代时,数组A B C
等每个插槽中只有一个字母。
一旦你完成了字母表,你就会得到一个向后看的索引,并将当前字母添加到该值。
你最终会进入AAA AAB AAC等甚至更多。
public static String[] colArray(int length) {
String[] result = new String[length];
String colName = "";
for(int i = 0; i < length; i++) {
char c = (char)('A' + (i % 26));
colName = c + "";
if(i > 25){
colName = result[(i / 26) - 1] + "" + c;
}
result[i] = colName;
}
return result;
}
答案 1 :(得分:2)
试试这样:
public static String[] charArray(int length)
{
String[] res = new String[length];
int counter = 0;
for(int i = 0; counter < length; i++)
{
String name = "";
int colNumber = i;
while(colNumber > 0 && colNumber % 27 != 0)
{
char c = (char) ('A' + ((colNumber) % 27) - 1);
name = c + name;
colNumber = colNumber / 27;
}
res[counter] = name;
if (i % 27 != 0) {
counter++;
}
}
return res;
}
基本上你的算法会跳过所有以A(A,AA,AB,...)开头的元素(因为当colNumber为0时会创建A,但这种情况永远不会发生,因为你的while会在这种情况下终止)。取模数为27然后实际上从char中减去1修复了这个问题。然后我们使用counter
作为索引,否则我们最终会得到数组中的一些空元素(i
将为i % 27 == 0
)。
答案 2 :(得分:1)
此解决方案适合我。有26个词汇表并且知道65是ASCII表中的字符'A',我们可以通过这种递归方法得到增量...
private fun indexLetters(index: Int, prefix: String = "") : String {
val indexSuffix:Int = index.rem(26)
val suffix = (65 + indexSuffix).toChar().toString().plus(".")
val newPrefix = suffix.plus(prefix)
val indexPrefix: Int = index / 26
return if (indexPrefix > 0) {
indexLetters(indexPrefix - 1, newPrefix)
} else {
newPrefix
}
}
您可以像
一样调用此kotlin方法indexLetters(0) //To get an 'A'
indexLetters(25) //To get a 'Z'
indexLetters(26) //To get an 'A.A'
etcetera...
来自数组迭代,具体取决于您的要求