如何在字符串中多次计算字符而不使用s循环

时间:2018-03-05 08:34:43

标签: java

下面的代码用于计算每次字符串'x'出现在字符串中但它只计算一次..

我不想使用循环。

public class recursionJava

{

   public static void main(String args[])

   {

      String names = "xxhixx";

      int result = number(names);
      System.out.println("number of x: " + result);
   }

   public static int number (String name)
   {

      int index = 0, result = 0;

      if(name.charAt(index) == 'x')
      {
         result++;
      }
      else
      {
         result = result;
      }
            index++;

      if (name.trim().length() != 0)
      {
        number(name);
      }
      return result;
   }
}

6 个答案:

答案 0 :(得分:6)

您可以替换/删除该字符,然后比较结果字符串的长度:

String names = "xxhixx";
int numX = names.length() - names.replace("x", "").length(); // numX == 4

答案 1 :(得分:5)

如果您不想使用循环,可以使用递归:

public static int number (String name)
{
    if (name.length () == 0)
        return 0;
    int count = name.charAt(0)=='x' ? 1 : 0;
    return count + number(name.substring(1));
}

答案 2 :(得分:4)

从Java 8开始,您可以使用流:

"xxhixx".chars().filter(c -> ((char)c)=='x').count()

答案 3 :(得分:4)

以前的递归回答(来自Eran)是正确的,尽管它在新的java版本中具有二次复杂性(子串复制字符串内部)。它可以是线性的:

    public static int number(String names, int position) {
    if (position >= names.length()) {
        return 0;
    }

    int count = number(names, position + 1);

    if ('x' == names.charAt(position)) {
        count++;
    }
    return count;
}

答案 4 :(得分:2)

由于以下两点,您的代码无效:

  1. 每次调用递归方法string macAddress = NetworkInterface .GetAllNetworkInterfaces() .Where( nic => nic.OperationalStatus == OperationalStatus.Up && nic.NetworkInterfaceType != NetworkInterfaceType.Loopback ) .Select( nic => nic.GetPhysicalAddress().ToString() ) .FirstOrDefault(); 时,都会将变量number()index设置为零。因此,该程序将始终停留在第一个字母上,并重置迄今为止找到的x的记录。
  2. 此外,result在这里几乎没用,因为此方法只删除空格,制表符等空白字符。
  3. 您可以通过

    解决这两个问题
    1. 制作name.trim()index全局变量和
    2. 使用result检查您是否已到达字符串的末尾。
    3. 所以最后,代码的略微修改(和工作)版本将如下所示:

      index

答案 5 :(得分:1)

您可以使用StringUtils.countMatches

StringUtils.countMatches(name,“x”);