Как подсчитать количество появлений символа в строке? - PullRequest
494 голосов
/ 09 ноября 2008

У меня есть строка

a.b.c.d

Я хочу посчитать вхождения '.' идиоматическим образом, предпочтительно однострочник.

(Ранее я выражал это ограничение как "без цикла", на случай, если вам интересно, почему все пытаются ответить без использования цикла).

Ответы [ 41 ]

1 голос
/ 29 июля 2017
String[] parts = text.split(".");
int occurances = parts.length - 1;

" It's a great day at O.S.G. Dallas! "
     -- Famous Last Words

Ну, это тот случай, когда вы знаете вашу Java, особенно ваше базовое базовое понимание классов коллекций, уже доступных в Java. Если вы посмотрите всю статью здесь, то здесь есть почти все, кроме объяснения Стивена Хокинга «Происхождения Вселенной», книги Дарвина о книге «Эволюция» и выбора актеров Джина Родденберри «Звездный путь» о том, почему они пошли с Уильямом Шатнером, как не делать это быстро и легко ...

... мне нужно больше говорить?

1 голос
/ 04 августа 2010

Попробуйте этот метод:

StringTokenizer stOR = new StringTokenizer(someExpression, "||");
int orCount = stOR.countTokens()-1;
1 голос
/ 10 июля 2013
 public static int countSubstring(String subStr, String str) {

    int count = 0;
    for (int i = 0; i < str.length(); i++) {
        if (str.substring(i).startsWith(subStr)) {
            count++;
        }
    }
    return count;
}
1 голос
/ 05 сентября 2013

Почему вы пытаетесь избежать петли? Я имею в виду, что вы не можете сосчитать точки «numberOf», не проверив каждый отдельный символ строки, и если вы вызовете какую-либо функцию, она каким-то образом зациклится. Это значит, что String.replace должен выполнить цикл, проверяющий, появляется ли строка, чтобы она могла заменить каждое вхождение.

Если вы пытаетесь сократить использование ресурсов, вы не будете этого делать, потому что вы создаете новую строку только для подсчета точек.

Теперь, если мы поговорим о рекурсивном методе "введите код здесь", кто-то сказал, что он потерпит неудачу из-за OutOfMemmoryException, я думаю, он забыл StackOverflowException.

Итак, мой метод будет таким (я знаю, что он похож на другие, но эта проблема требует цикла):

public static int numberOf(String str,int c) {
    int res=0;
    if(str==null)
        return res;
    for(int i=0;i<str.length();i++)
        if(c==str.charAt(i))
            res++;
    return res;
}
1 голос
/ 30 августа 2014

Я вижу много трюков и тому подобное. Теперь я не против красивых трюков, но лично мне нравится просто вызывать методы, которые означают для выполнения работы, поэтому я создал еще один ответ.

Обратите внимание, что если производительность вызывает какие-либо проблемы, используйте ответ Джона Скита . Это немного более обобщенно и, следовательно, немного более читабельно, на мой взгляд (и, конечно, многократно используется для строк и шаблонов).

public static int countOccurances(char c, String input) {
    return countOccurancesOfPattern(Pattern.quote(Character.toString(c)), input);
}

public static int countOccurances(String s, String input) {
    return countOccurancesOfPattern(Pattern.quote(s), input);
}

public static int countOccurancesOfPattern(String pattern, String input) {
    Matcher m = Pattern.compile(pattern).matcher(input);
    int count = 0;
    while (m.find()) {
        count++;
    }
    return count;
}
0 голосов
/ 01 августа 2018

public static void getCharacter (String str) {

    int count[]= new int[256];

    for(int i=0;i<str.length(); i++){


        count[str.charAt(i)]++;

    }
    System.out.println("The ascii values are:"+ Arrays.toString(count));

    //Now display wht character is repeated how many times

    for (int i = 0; i < count.length; i++) {
        if (count[i] > 0)
           System.out.println("Number of " + (char) i + ": " + count[i]);
    }


}

}

0 голосов
/ 26 апреля 2017

Если вы хотите считать нет. того же символа в строке «SELENIUM» или вы хотите напечатать уникальные символы строки «SELENIUM».

открытый класс Count_Characters_In_String {

 public static void main(String []args){

    String s = "SELENIUM";
    System.out.println(s);
    int counter;

   String g = "";

    for( int i=0; i<s.length(); i++ ) { 

    if(g.indexOf(s.charAt(i)) == - 1){
       g=g+s.charAt(i); 
      }

   }
   System.out.println(g + " ");



    for( int i=0; i<g.length(); i++ ) {          
      System.out.print(",");

      System.out.print(s.charAt(i)+ " : ");
      counter=0; 
      for( int j=0; j<s.length(); j++ ) { 

    if( g.charAt(i) == s.charAt(j) ) {
       counter=counter+1;

       }      

      }
      System.out.print(counter); 
   }
 }

}

/ ******************** ВЫХОД ********************** /

СЕЛЕНА

СЕЛНИУМ

S: 1, E: 2, L: 1, E: 1, N: 1, I: 1, U: 1

0 голосов
/ 31 мая 2014

Как насчет ниже рекурсивного алгоритма. Что также является линейным временем.

import java.lang.*;
import java.util.*;

class longestSubstr{

public static void main(String[] args){
   String s="ABDEFGABEF";


   int ans=calc(s);

   System.out.println("Max nonrepeating seq= "+ans);

}

public static int calc(String s)
{//s.s
      int n=s.length();
      int max=1;
      if(n==1)
          return 1;
      if(n==2)
      {
          if(s.charAt(0)==s.charAt(1)) return 1;
          else return 2;


      }
      String s1=s;
    String a=s.charAt(n-1)+"";
          s1=s1.replace(a,"");
         // System.out.println(s+" "+(n-2)+" "+s.substring(0,n-1));
         max=Math.max(calc(s.substring(0,n-1)),(calc(s1)+1));


return max;
}


}


</i>
0 голосов
/ 30 августа 2015

Попробуйте этот код:

package com.java.test;

import java.util.HashMap;
import java.util.Map;

public class TestCuntstring {

    public static void main(String[] args) {

        String name = "Bissssmmayaa";
        char[] ar = new char[name.length()];
        for (int i = 0; i < name.length(); i++) {
            ar[i] = name.charAt(i);
        }
        Map<Character, String> map=new HashMap<Character, String>();
        for (int i = 0; i < ar.length; i++) {
            int count=0;
            for (int j = 0; j < ar.length; j++) {
                if(ar[i]==ar[j]){
                    count++;
                }
            }
            map.put(ar[i], count+" no of times");
        }
        System.out.println(map);
    }

}
0 голосов
/ 19 марта 2015

Я пытался решить ваш вопрос с помощью оператора switch, но мне все еще требовался цикл for для разбора строки. не стесняйтесь комментировать, если я могу улучшить код

public class CharacterCount {
public static void main(String args[])
{
    String message="hello how are you";
    char[] array=message.toCharArray();
    int a=0;
    int b=0;
    int c=0;
    int d=0;
    int e=0;
    int f=0;
    int g=0;
    int h=0;
    int i=0;
    int space=0;
    int j=0;
    int k=0;
    int l=0;
    int m=0;
    int n=0;
    int o=0;
    int p=0;
    int q=0;
    int r=0;
    int s=0;
    int t=0;
    int u=0;
    int v=0;
    int w=0;
    int x=0;
    int y=0;
    int z=0;


    for(char element:array)
    {
        switch(element)
        {
        case 'a':
        a++;
        break;
        case 'b':
        b++;
        break;
        case 'c':c++;
        break;

        case 'd':d++;
        break;
        case 'e':e++;
        break;
        case 'f':f++;
        break;

        case 'g':g++;
        break;
        case 'h':
        h++;
        break;
        case 'i':i++;
        break;
        case 'j':j++;
        break;
        case 'k':k++;
        break;
        case 'l':l++;
        break;
        case 'm':m++;
        break;
        case 'n':m++;
        break;
        case 'o':o++;
        break;
        case 'p':p++;
        break;
        case 'q':q++;
        break;
        case 'r':r++;
        break;
        case 's':s++;
        break;
        case 't':t++;
        break;
        case 'u':u++;
        break;
        case 'v':v++;
        break;
        case 'w':w++;
        break;
        case 'x':x++;
        break;
        case 'y':y++;
        break;
        case 'z':z++;
        break;
        case ' ':space++;
        break;
        default :break;
        }
    }
    System.out.println("A "+a+" B "+ b +" C "+c+" D "+d+" E "+e+" F "+f+" G "+g+" H "+h);
    System.out.println("I "+i+" J "+j+" K "+k+" L "+l+" M "+m+" N "+n+" O "+o+" P "+p);
    System.out.println("Q "+q+" R "+r+" S "+s+" T "+t+" U "+u+" V "+v+" W "+w+" X "+x+" Y "+y+" Z "+z);
    System.out.println("SPACE "+space);
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...