如何使用java查找大字符串中最常见的字符?

时间:2014-01-27 18:21:32

标签: java string char

我正在进行一项任务,我必须在字符串中找到最常用的四个字符。 我写这个到目前为止。

import java.util.Scanner;
public class FindTheMostOccur
{
   public static void main (String[] args) 
   {
      String input;
      String example = "how to find the most frequent character in a big string using    java?";

      String[] array = new String[example.length()];

      for (int i = 97; i < 123; i++)

      {
         int mostFrequent =0;

         for( int j = 0; j < example.length(); j++)
         {
            if(example.charAt(j) == i)
            {
               ++mostFrequent;
            }

         }

            System.out.println( (char)i + " is showing " + mostFrequent+ " times ");

      }
   }
}

以下是此示例的输出。

a显示5次

b显示1次

c显示2次

d显示1次

e显示4次

f显示2次

g显示3次

h显示3次

我正在展示5次

j显示1次

k显示0次

l显示0次

m显示1次

n显示5次

o显示3次

p显示0次

q显示1次

r显示4次

显示3次

t显示6次

你正在展示2次

v显示1次

w显示1次

x显示0次

y显示0次

在这个考试中:t,a,i,n

我不需要有人为我完成程序,但是我需要一些想法,如何找到这个例子中最常见的四个字符。

5 个答案:

答案 0 :(得分:3)

我能想到的最简单的算法是,不进行多次传递就可以进行一次传递。

创建从字符到计数的HashMap映射。

每次找到一个字符(如果它不在地图中)时,请将其添加为值1.如果它在地图中,则递增计数。

在循环结束时,HashMap现在包含String中每个字符的计数。

EntrySet获取HashMap并将其转储到new ArrayList

使用自定义比较器对ArrayList进行排序,使用entry.getValue()进行比较。

ArrayList中的第一个(或最后一个取决于排序方向)值将是您想要的值。

答案 1 :(得分:3)

这个怎么样?

int count[] = new int[1000];// all with zero

然后对于字符串中的每个字符,像这样做count[]++

count['c']++;
count['A']++;

最后,找出哪个索引保持最大值。然后只需打印该索引的ascii

答案 2 :(得分:1)

好的,这里有一些想法:

  • 要查找4个最常用的字符,您必须首先知道所有字符的频率。所以,你需要将频率存储在某个地方。目前,您只是打印每个角色的频率。你无法比较那种方式。所以,你需要一个数据结构。

  • 这里我们讨论的是从字符到其计数的映射。可能你需要一个哈希表。请注意Java中的哈希表实现。您会找到HashMapLinkedHashMapTreeMap

  • 由于您需要4个最常用的字符,因此您需要按频率对字符进行排序。找出哪种地图按排序顺序存储元素。注意:您需要按值排序地图,而不是键。并按降序排序,这很明显。

使用数组:

  • 您可以遵循另一种方法。您可以创建一个大小为26的数组,假设您只想计算字母字符的频率。

    int[] frequency = new int[26];
    
  • 该数组的每个索引对应于单个字符的频率。迭代字符串,并将与当前字符对应的索引增加1。

  • 你可以像这样做索引映射的字符:

    int index = ch - 'a';
    

    因此,对于字符'a',索引将为0,对于字符'b',索引将为1,依此类推。您可能还需要处理区分大小写

阵列方法的问题是,一旦你对数组进行排序以获得4个最常见的字符,你就会丢失字符到索引映射。因此,您需要有一些方法来对指数进行排序以及这些指数的频率。你是对的。你需要另一个阵列。

但是,拥有2个阵列会让你的问题变得简单吗?不会。因为很难同步排序2个阵列。那么该怎么办?您可以创建一个存储索引字符的类。维护大小为26的类引用的数组。然后找到将数组方法移植到此数组的方法。

答案 3 :(得分:0)

您可以使用哪些数据结构? 我想你可以使用优先级队列并增加包含正在重复的字符的节点的优先级。完成后,第一个索引将包含具有最多重复字符的节点

答案 4 :(得分:0)

我有另一个想法,你只能使用数组。 那么你在Alphabet中有26个字母。小写字母的ASCII码范围从97到122(您可以使用.lowercase()或类似的东西使每个字母成为小写)。 因此,对于每个字符,获取其ASCII码,执行ASCII码-97并递增它。 简单,只需要一个数组。