如果我有以下char
类型的2D对象:
aaaa...||
bbb..|ccc
ddddd..|d
方法countChars()
返回不同字母的数量,即在上面的示例中,返回的结果为4
,因为有a,b,c,
和d
个字符。它不计算每个字符(计数时不包括'.'
和'|'
)但计算数组中不同字符的数量。另一个例子:
zzz.zz||
....tt|.
wwwwwwww
该方法返回的上述结果为3
(z
,t
和w
)
在我的代码中,我没有得到理想的结果。
public int countChars()
{
char originalChar = 0;
char anotherChar = 0;
int count = 0;
for(int r = 0; r < height; r++)
{
for(int c = 0; c < width; c++)
{
if(space[r][c] != '.' || space[r][c] != '|')
{
space[r][c] = originalChar;
}
count++;
space[r][c] = originalChar;
}
}
return count;
}
答案 0 :(得分:2)
我会使用Set
来处理这个问题,因为它消除了重复计算的问题。
public int countChars() {
Set<Character> set = new HashSet<Character>();
for (int r = 0; r < height; ++r) {
for (int c = 0; c < width; ++c) {
if (space[r][c] != '.' && space[r][c] != '|') {
set.add(new Character(space[r][c]));
}
}
}
return set.size();
}
此解决方案假定.
和|
是您要排除的唯一两个字符。如果您考虑到只计算字母(或字母和数字),请更新您的问题陈述。
答案 1 :(得分:1)
问题是你试图循环循环中的每个字符,甚至没有检查它们是否已被计算:
你需要做的是创建一个数组来保存已经计算过的char:
下面的示例没有使用任何集合框架。
public int countChars()
{
char originalChar = 0;
char anotherChar = 0;
int count = 0;
char [] countedChar = new char[255] //max char array
for(int r = 0; r < height; r++)
{
for(int c = 0; c < width; c++)
{
if(space[r][c] != '.' || space[r][c] != '|')
{
space[r][c] = originalChar;
continue;
}
if(countedChar[space[r][c]] != null) continue; //if char is already counted then continue;
countedChar[space[r][c]] = 's'; //add the index of the char array as the char number.
count++;
space[r][c] = originalChar;
}
}
return count;
}
答案 2 :(得分:0)
创建一个包含唯一字符的字符数组。每次你来到一个不是'。'的char。还是一个'|'将它与数组的每个字符进行比较,如果没有匹配项,则将其添加到数组中并增加计数。这是一些psudo代码。
char[] uniqueChars = new char[26];
boolean unique = true;
int count = 0;
while(!at the end of the arrays){
char c = next character in the arrays;
for(int i = 0; i<count; i++){
if(uniqeChars[i]==c){
unique = false
}
}
if(unique){
uniqueChars[count] = c;
count++;
}
unique = true;
}