计算字符串中的某个字符(Java)

时间:2010-03-10 15:39:45

标签: java string

String a =“(Yeahhhh)我终于把它变成了(顶部)”;

鉴于上面的String,共有4个'('和')'。

我对计数的想法是利用String.charAt方法。但是,这种方法相当慢,因为我必须为每个字符串执行此计数至少10000次,因为我的项目的性质。

任何人都有比使用.chartAt方法更好的想法或建议?????

很抱歉由于之前没有明确解释,我10000次的意思是分析10000个句子,这是上面的字符串a只有一个句子。

6 个答案:

答案 0 :(得分:6)

听起来像是家庭作业,所以我会尽量保持“朝着正确的方向努力”。

如果您删除了所有字符而不是您要查找的字符,并查看该字符串的长度,该怎么办?

有一种String方法可以帮助你解决这个问题。

答案 1 :(得分:6)

StringUtils.countMatches(wholeString, searchedString)(来自commons-lang

searchedString可能是一个字符 - "("

它(如评论中所述)多次调用charAt(..)。但是,复杂性是多少?好吧,它的O(n) - charAt(..)有复杂性O(1),所以我不明白你为什么觉得它很慢。

答案 2 :(得分:2)

您可以使用toCharArray()一次并对其进行迭代。 可能更快。

为什么每个字符串需要10000次这样做?你为什么不记得第一次的结果?这比单个计数加速节省了很多。

答案 3 :(得分:1)

您可以通过以下方法实现此目的。

此方法将返回一个带有键的映射作为字符和值,作为其在输入字符串中的出现。

Map countMap = new HashMap();

public void updateCountMap(String inStr, Map<Character, Integer> countMap)
    {
        char[] chars =  inStr.toCharArray();
        for(int i=0;i<chars.length;i++)
        {
            if(!countMap.containsKey(chars[i]))
            {
                 countMap.put(chars[i], 1);
            }
            countMap.put(chars[i] ,countMap.get(chars[i])+1);
        }
        return countMap;        
    }

我们可以做的是逐行读取文件并为每一行调用上面的方法。每次地图都会不断添加字符的值(出现次数)。因此,Character数组的大小永远不会太长,我们可以实现我们所需要的。

优势: 对输入字符串的字符进行单次迭代。 字符数组大小永远不会增长到高限。 结果图包含每个字符的出现次数。

干杯

答案 4 :(得分:1)

您可以使用正则表达式执行此操作:

Pattern pattern = Pattern.compile("[\\(\\)]"); //Pattern says either '(' or ')'
Matcher matcher = pattern.matcher("(Yeahhhh) I have finally made it to the (top)");
int count = 0;
while (matcher.find()) { //call find until nothing is found anymore
  count++;
}
System.out.println("count "+count);

Pro是,Patterns非常灵活。您还可以搜索包含的单词:"\\(\\w+\\)"(A'('后跟一个或多个单词字符,后跟')')

Con是,对于非常简单的情况,它可能就像打破方向盘上的苍蝇一样

有关正则表达式的详细信息,请参阅Javadoc of Pattern

答案 5 :(得分:0)

我测试了以下10M字符串的方法来计算“,”符号。

// split a string by ","
public static int nof1(String s)
{
  int n = 0;
  if (s.indexOf(',') > -1)
    n = s.split(",").length - 1;
  return n;
} // end method nof1

// count "," using char[]
public static int nof2(String s)
{
  char[] C = s.toCharArray();
  int n = 0;
  for (char c : C)
  {
    if (c == ',')
      n++;
  } // end for c
  return n;
} // end method nof2

// replace "," and calculate difference in length
public static int nof3(String s)
{
  String s2 = s.replaceAll(",", "");
  return s.length() - s2.length();
} // end method nof3

// count "," using charAt
public static int nof4(String s)
{
  int n = 0;
  for(int i = 0; i < s.length(); i++)
  {
    if (',' == s.charAt(i) )
      n++;
  } // end for i
  return n;
} // end method nof4

// count "," using Pattern
public static int nof5(String s)
{
  // Pattern pattern = Pattern.compile(","); // compiled outside the method
  Matcher matcher = pattern.matcher(s);
  int n = 0;
  while (matcher.find() )
  {
    n++;
  }
  return n;
} // end method nof5

结果:

nof1: 4538 ms
nof2:  474 ms
nof3: 4357 ms
nof4:  357 ms
nof5: 1780 ms

所以,charAt是最快的。顺便说一下,grep -o ',' | wc -l花了7402毫秒。