首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >计算字母数字字符的出现并以图形方式打印它们

计算字母数字字符的出现并以图形方式打印它们
EN

Stack Overflow用户
提问于 2013-09-12 14:21:19
回答 11查看 18.2K关注 0票数 7

我有一个字符串,我想计数所有字母和数字的出现,并希望创建一个图形,这样我就可以以图形的方式看到发生的情况。

例如:

代码语言:javascript
运行
复制
String sentence = "ABC ABC ABC 123"

A (3) * * *
B (3) * * *
C (3) * * *
D
.
.

我的想法是:

  1. 计算字符串中的所有数字和字母
  2. 打印所有星号乘以这个数字(不幸的是,我不能用Java中的int乘以字符串)

我认为有两种计算字符的方法。我既可以使用charAt()方法,也可以使用toCharArray()循环字符串或数组,并对字母进行计数。

例如:

代码语言:javascript
运行
复制
aCounter = 0;
bCounter = 0;
char ch = sentence.charAt(i);

for (i = 0; i < sentence.length(); ++i) {
    if (ch == 'a') {
        aCounter++;
    }
    if (ch == 'b') {
        bCounter++;
    }
}

然而,对于这种方法,我有多个问题:

  • 我需要做大量的反变量-- aCounter通过zCounter0counter通过9counter
  • 我得再做一个for循环打印星号!

我不是在要求一个固定的答案,我只是在找一些好的方向,因为我被困住了。

EN

回答 11

Stack Overflow用户

发布于 2013-09-12 14:24:24

没有必要为此做一个HashTable/HashMap/HashSet

您知道提前跟踪哪些字符,因此可以使用数组.

我想数一下所有字母和数字的出现情况。

生成要跟踪的字符的字符串,然后初始化数组。

代码语言:javascript
运行
复制
String sentence = "ABC ABC ABC 123";

//Make a map of all the characters you want to track.
String indexes = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

//Initialize an array to the size of the possible matches.
int[] count = new int[indexes.length()];

//Loop through the sentence looking for matches.
for (int i = 0; i < sentence.length(); i++) {
    //This will get the index in the array, if it's a character we are tracking
    int index = indexes.indexOf(sentence.charAt(i));

    //If it's not a character we are tracking, indexOf returns -1, so skip those.
    if (index < 0)
        continue;

    count[index]++;
}

然后你可以用这个打印出来:

代码语言:javascript
运行
复制
for (int i = 0; i < count.length; i++) {
    if (count[i] < 1)
        continue;

    System.out.println(String.format("%s (%d) %s",
            indexes.charAt(i),
            count[i],
            //This little bit of magic creates a string of nul bytes, then replaces it with asterisks.
            new String(new char[count[i]]).replace('\0', '*')));
}

如果您不习惯使用new String(new char[count[i]]).replace('\0', '*'))位,那么在尝试输出星号String之前,可以使用StringBuilder构建星号String。您可以在下面看到@mike的示例,以获得一个很好的示例。

输出

代码语言:javascript
运行
复制
1 (1) *
2 (1) *
3 (1) *
A (3) ***
B (3) ***
C (3) ***

注意事项

在决定如何解决这个问题时,以下是一些需要考虑的问题。

  • 您是否总是知道需要提前跟踪哪些字符,还是会有需要跟踪任何字符的时间?在后一种情况下,数组不适合您;您需要使用高级数据结构,如TreeMap或HashMap。
  • 您是否总是在计算特定chars的出现次数,而不是Strings?如果您必须修改它以计数Strings,那么使用String indexes映射技巧也不会对您起作用。
  • 您目前正在学习特定的数据结构吗?通常,像这样的问题分配给学生来理解如何应用特定的概念。正如@kyle建议的那样,您应该尝试使用您正在学习或已经在您的课堂上学习的数据结构。有时候,使用你还没有学过的结构会给你带来麻烦,或者至少会给你带来更低的分数。
票数 8
EN

Stack Overflow用户

发布于 2013-09-12 14:26:58

下面是一些让你开始的提示:

  1. 不要为每个计数器使用单独的变量。使用数组(或某种集合类型.如果有人教过你这个.)。
  2. 可以使用字符作为数组索引。
  3. 在开始打印任何内容之前,积累所有的计数。
票数 2
EN

Stack Overflow用户

发布于 2013-09-12 14:27:27

您可以使用另一种方法,而不是循环一次计算金额,再循环一次打印星号:

代码语言:javascript
运行
复制
Map<Character,String> results = new HashMap<Character, String>();

然后,每次迭代时,检查映射是否包含该字符的数据,如果没有,则初始化它。伪码:

代码语言:javascript
运行
复制
If the map contains data for the key
    Obtain the data for the character
    append a new asterisk
Else
    Create a String with an asterisk
    Append an asterisk
    Put the String with the character as key

如果您曾经需要星号的数量作为一个数字,您总是可以获得String的大小(假设您没有放置任何空格)。

更新

作为一种改进,考虑到我与@crush分享的评论,两个调整可以改进逻辑:

  • StringBuilder而不是String__:避免不必要的文字创建。
  • TreeMap而不是HashMap__:它将给地图以适当的顺序,允许对其内容进行排序打印。

如果有足够的空间(和知识)来证明它们的使用,则由OP来添加这些额外的内容。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18766857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档