Подтвердить что ты не робот

Как подсчитать частоту символов в строке?

Мне нужно написать какой-то цикл, который может подсчитывать частоту каждой буквы в строке.
Например: "aasjjikkk" будет считать 2 'a', 1 's', 2 'j', 1 'i', 3 'k'. В конечном счете идентификатор, подобный этим, заканчивается на карте с символом в качестве ключа и счетчиком в качестве значения. Любая хорошая идея, как это сделать?

4b9b3361

Ответ 1

Вы можете использовать Java Map и сопоставить char с int. Затем вы можете перебирать символы в строке и проверять, были ли они добавлены на карту, если они есть, вы можете затем увеличить его значение.

Например:

HashMap<Character, Integer> map = new HashMap<Character, Integer>();
String s = "aasjjikkk";
for (int i = 0; i < s.length(); i++) {
    char c = s.charAt(i);
    Integer val = map.get(c);
    if (val != null) {
        map.put(c, new Integer(val + 1));
    }
    else {
       map.put(c, 1);
   }
}

В конце у вас будет количество всех персонажей, с которыми вы столкнулись, и вы сможете извлечь их частоты из этого.

Кроме того, вы можете использовать Bozho решение с использованием Multiset и подсчета общего числа случаев.

Ответ 2

Вы можете использовать Multiset (из guava). Он даст вам счет для каждого объекта. Например:

Multiset<Character> chars = HashMultiset.create();
for (int i = 0; i < string.length(); i++) {
    chars.add(string.charAt(i));
}

Затем для каждого символа вы можете вызвать chars.count('a') и он возвращает количество вхождений

Ответ 3

Краткий способ сделать это:

Map<Character,Integer> frequencies = new HashMap<>();
for (char ch : input.toCharArray()) 
   frequencies.put(ch, frequencies.getOrDefault(ch, 0) + 1);

Мы используем for-each для циклического прохождения каждого символа. frequencies.getOrDefault() получает значение, если присутствует ключ, или возвращает (по умолчанию) свой второй аргумент.

Ответ 4

Используя API потока от JDK-8:

Map<Character, Long> frequency =
            str.chars()
               .mapToObj(c -> (char)c)
               .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

или если вы хотите, чтобы ключи были целыми числами:

Map<Character, Integer> frequency =
            str.chars()
               .mapToObj(c -> (char)c)
               .collect(Collectors.groupingBy(Function.identity(), Collectors.summingInt(c -> 1)));

Другой вариант:

Map<Character, Integer> frequency = 
            str.chars()
               .mapToObj(c -> (char)c)
               .collect(Collectors.toMap(Function.identity(), c -> 1, Math::addExact));

Ответ 5

Вот другое решение, изворотливое, как может быть.

public char getNumChar(String s) {
    char[] c = s.toCharArray();
    String alphabet = "abcdefghijklmnopqrstuvwxyz";
    int[] countArray = new int[26];
    for (char x : c) {
        for (int i = 0; i < alphabet.length(); i++) {
            if (alphabet.charAt(i) == x) {
                countArray[i]++;
            }
        }
    }

    java.util.HashMap<Integer, Character> countList = new java.util.HashMap<Integer, Character>();

    for (int i = 0; i < 26; i++) {
        countList.put(countArray[i], alphabet.charAt(i));
    }
    java.util.Arrays.sort(countArray);
    int max = countArray[25];
    return countList.get(max);
}

Ответ 6

Ну, два способа приходят на ум, и это зависит от ваших предпочтений:

  • Сортировка массива по символам. Тогда подсчет каждого символа становится тривиальным. Но сначала вам нужно будет сделать копию массива.

  • Создайте еще один целочисленный массив размером 26 (например, freq), а str - массив символов.

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

    freq[str[i] - 'a'] ++; //Assuming all characters are in lower case

Таким образом, число "a" будет сохранено на частоте [0], а число "z" будет на частоте [25]

Ответ 7

Вот решение:

Определите свой собственный Pair:

public class Pair
{
    private char letter;
    private int count;
    public Pair(char letter, int count)
    {
        this.letter = letter;
        this.count= count;
    }
    public char getLetter(){return key;}
    public int getCount(){return count;}
}

Тогда вы могли бы сделать:

public static Pair countCharFreq(String s)
{
    String temp = s;
    java.util.List<Pair> list = new java.util.ArrayList<Pair>();
    while(temp.length() != 0)
    {
        list.add(new Pair(temp.charAt(0), countOccurrences(temp, temp.charAt(0))));
        temp.replaceAll("[" + temp.charAt(0) +"]","");
    }
}

public static int countOccurrences(String s, char c)
{
    int count = 0;
    for(int i = 0; i < s.length(); i++)
    {
        if(s.charAt(i) == c) count++;
    }
    return count;
}

Ответ 8

Поскольку не было решения Java 8, подумал о публикации. Кроме того, это решение намного аккуратнее, удобочитаемее и кратко, чем некоторые другие решения, упомянутые здесь.

String string = "aasjjikkk";

Map<Character, Long> characterFrequency = string.chars()  // creates an IntStream
    .mapToObj(c -> (char) c) // converts the IntStream to Stream<Character>
    .collect(Collectors.groupingBy(c -> c, Collectors.counting())); // creates a
                                                                    // Map<Character, Long> 
                                                                    // where the Long is
                                                                    // the frequency

Ответ 9

package com.rishi.zava;

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

public class ZipString {
    public static void main(String arg[]) {
        String input = "aaaajjjgggtttssvvkkllaaiiikk";
        int len = input.length();
        Map<Character, Integer> zip = new HashMap<Character, Integer>();
        for (int j = 0; len > j; j++) {
            int count = 0;
            for (int i = 0; len > i; i++) {
                if (input.charAt(j) == input.charAt(i)) {
                    count++;
                }
            }
            zip.put(input.charAt(j), count);
        }
        StringBuffer myValue = new StringBuffer();
        String myMapKeyValue = "";
        for (Entry<Character, Integer> entry : zip.entrySet()) {
            myMapKeyValue = Character.toString(entry.getKey()).concat(
                    Integer.toString(entry.getValue()));
            myValue.append(myMapKeyValue);
        }
        System.out.println(myValue);
    }
}

Вход= aaaajjjgggtttssvvkkllaaiiikk

Выход= a6s2t3v2g3i3j3k4l2

Ответ 10

Вы можете использовать CharAdapter и CharBag из Eclipse Collections и избегать бокса на Character и Integer.

CharBag bag = CharAdapter.adapt("aasjjikkk").toBag();

Assert.assertEquals(2, bag.occurrencesOf('a'));
Assert.assertEquals(1, bag.occurrencesOf('s'));
Assert.assertEquals(2, bag.occurrencesOf('j'));
Assert.assertEquals(1, bag.occurrencesOf('i'));
Assert.assertEquals(3, bag.occurrencesOf('k'));

Примечание. Я являюсь коммиттером для коллекций Eclipse.

Ответ 11

String s = "aaaabbbbcccddddd";
Map<Character, Integer> map = new HashMap<>();

Использование одной строки в Java8

s.chars().forEach(e->map.put((char)e, map.getOrDefault((char)e, 0) + 1));

Ответ 12

Если это не должно быть супер-быстрым, просто создайте массив целых чисел, одно целое для каждой буквы (возможно только буквенное число, например, 2 * 26 целых чисел или любые двоичные данные?). пройдите через строку char за раз, получите индекс ответственного целого числа (например, если у вас есть только алфавитные символы, вы можете иметь "A" в индексе 0 и получить этот индекс, вычитая любые "A" в "Z" 'by' A ', как пример того, как вы можете получить достаточно быстрые индексы) и увеличивать значение в этом индексе.

Существуют различные микро-оптимизации, чтобы сделать это быстрее (при необходимости).

Ответ 13

Вы можете использовать Hashtable с каждым символом в качестве ключа, и общее количество будет значением.

Hashtable<Character,Integer> table = new Hashtable<Character,Integer>();
String str = "aasjjikkk";
for( c in str ) {
    if( table.get(c) == null )
        table.put(c,1);
    else
        table.put(c,table.get(c) + 1);
}

for( elem in table ) {
    println "elem:" + elem;
}

Ответ 14

Это похоже на ответ xunil154, за исключением того, что строка создается массивом char, а связанный хэш файл используется для поддержания порядка вставки символов.

String text = "aasjjikkk";
char[] charArray = text.toCharArray();
Map<Character, Integer> freqList = new LinkedHashMap<Character, Integer>();

        for(char key : charArray) {
            if(freqList.containsKey(key)) {
               freqList.put(key, freqList.get(key) + 1);
            } else
                freqList.put(key, 1);
        }

Ответ 15

NOTE, this will also count the frequencies of empty spaces


import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;


public class FrequenceyOfCharacters {

    public static void main(String[] args) {
        System.out.println("Please enter the string to count each character frequencey: ");
        Scanner sc=new  Scanner(System.in);
        String input=sc.nextLine();
        frequenceyCount(input);


    }

    private static void frequenceyCount(String input) {

        Map<Character,Integer> hashCount=new HashMap<>();
        Character c;
        for(int i=0; i<input.length();i++)
        {
           c =input.charAt(i);
           if(hashCount.get(c)!=null){
               hashCount.put(c, hashCount.get(c)+1);
           }else{
               hashCount.put(c, 1);
           }
        }
        Iterator it = hashCount.entrySet().iterator();
        System.out.println("char : frequency");
        while (it.hasNext()) {
            Map.Entry pairs = (Map.Entry)it.next();
            System.out.println(pairs.getKey() + " : " + pairs.getValue());
            it.remove(); 
        }

    }

}

Ответ 16

import java.util.*;
class Charfrequency
{
 public static void main(String a[]){

        Scanner sc=new Scanner(System.in);
        System.out.println("Enter Your String :");
        String s1=sc.nextLine();
        int count,j=1;
        char var='a';
        char ch[]=s1.toCharArray();
        while(j<=26)
        {
           count=0;
                for(int i=0; i<s1.length(); i++)
                {
                    if(ch[i]==var || ch[i]==var-32)
                    {
                        count++;
                    }
                }
                if(count>0){
                System.out.println("Frequency of "+var+" is "+count);
                }
                var++;
                j++;
        }
 }
}

Ответ 17

Короткий код с использованием HashMap. (Без силовой строки)

private static Map<Character, Integer> findCharacterFrequency(String str) {

        Map<Character, Integer> map = new HashMap<>();

        for (char ch : str.toCharArray()) {
            /* Using getOrDefault(), since Java1.8 */
            map.put(ch, map.getOrDefault(ch, 0) + 1);
        }
        return map;
    }

Ответ 18

Пожалуйста, попробуйте данный код ниже, надейтесь, что он вам поможет,

import java.util.Scanner;

class String55 {
    public static int frequency(String s1,String s2)
    {

        int count=0;
        char ch[]=s1.toCharArray();
        char ch1[]=s2.toCharArray();
        for (int i=0;i<ch.length-1; i++)
        {



                int k=i;

                int j1=i+1;
                int j=0;
                int j11=j;
                int j2=j+1;
                {
                    while(k<ch.length && j11<ch1.length && ch[k]==ch1[j11])
                    {
                    k++;
                    j11++;

                    }


                int l=k+j1;
                int m=j11+j2;
                if( l== m)
                {
                    count=1;
                    count++;
                }





        }
        }
        return count;


    }
    public static void main (String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.println("enter the pattern");
        String s1=sc.next();
            System.out.println("enter the String");
            String s2=sc.next();
            int res=frequency(s1, s2);
            System.out.println("FREQUENCY==" +res);

    }
}

ВЫХОД ИЗОБРАЖЕНИЯ: ввести шаблон человек введите строку dhimanman ЧАСТОТЫ == 2

Благодарю вас. Хорошее кодирование.

Ответ 19

Вопрос: Возьмите строку пользователем и получите частоту каждого символа. !!!!!!!!!!

import java.util.HashMap;
import java.util.Scanner;
public class FrequencyPrograme {
    public static void main(String str[]){
        HashMap<Character,Integer> frequency=new HashMap<Character,Integer>();
        Scanner inputString=new Scanner(System.in);
        System.out.print("Please enter the string.");
        String String  =inputString.next();
        for(int i=0; i<String .length();i++){
            char ch=String .charAt(i);
            Integer value=frequency.get(ch);
            if(value!=null){
                frequency.put(ch, new Integer(value+1));
            }else{
                frequency.put(ch, 1);
            }
        }
        System.out.println(frequency);
    }
}

Ответ 20

package com.dipu.string;

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

public class RepetativeCharInString {
    public static void main(String[] args) {
        String data = "aaabbbcccdddffffrss";
        char[] charArray = data.toCharArray();
        Map<Character, Integer> map = new HashMap<>();
        for (char c : charArray) {
            if (map.containsKey(c)) {
                map.put(c, map.get(c) + 1);
            } else {
                map.put(c, 1);
            }
        }
        System.out.println(map);

    }
}

Ответ 21

*import java.util.ArrayList;
import java.util.Collections;

public class Freq {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String temp="zsaaqaaaaaaaabbbbbcc";
    List<String> temp1= new ArrayList<String> ();
    ArrayList<Integer>freq=new ArrayList<Integer>();
    for(int i=0;i<temp.length()-1;i++)
    {       
        temp1.add(Character.toString(temp.charAt(i)));      
    }
    Set<String> uniqset=new HashSet<String>(temp1);
    for(String s:uniqset)
    {
        freq.add(Collections.frequency(temp1, s));
        System.out.println(s+" -->>"+Collections.frequency(temp1, s));
    }
    }

}
           ------Output-------
       a -->>10
       b -->>5
       c -->>1
       q -->>1
       s -->>1
       z -->>1

Используйте частотный метод коллекций для подсчета частоты символов *

Ответ 22

Uffh. Тебе не кажется, что это самое простое решение?

    char inputChar = '|';
    int freq = "|fd|fdfd|f dfd|fd".replaceAll("[^" + inputChar +"]", "").length();
    System.out.println("freq " + freq);

Ответ 23

 #include<stdio.h>'
 '#include <string.h>'
  int main()
{
    char s[1000];  
    int  i,j,k,count=0,n;
    printf("Enter  the string : ");
    gets(s);
    for(j=0;s[j];j++);
    n=j; 
    printf(" frequency count character in string:\n");
    for(i=0;i<n;i++)  
    {
        count=1;
        if(s[i])
        {

          for(j=i+1;j<n;j++)  
          {   

            if(s[i]==s[j])
            {
                 count++;
                 s[j]='\0';
            }
          }  
          printf(" '%c' = %d \n",s[i],count);
       }
    } 
    return 0;
}

Ответ 24

void usingCollections(){

  String input = "cuttack";

  String [] stringArray = input.split("");

  Set<String> s = new HashSet(Arrays.asList(stringArray));

  for(String abc : s){

    System.out.println (abc + ":"+Collections.frequency(Arrays.asList(stringArray),abc));

  }
}

Ответ 25

import java.io.FileInputStream;
import java.util.HashSet;
import java.util.Iterator;
public class CountFrequencyOfCharater {
public static void main(String args[]) throws Exception
{
    HashSet hs=new HashSet();
    String str="hey how are you?";
    char arr[]=new char[str.length()];
    for(int i=0;i<str.length();i++)
    {
        arr[i]=str.charAt(i);
    }
    for(int j=0;j<str.length();j++)
    {
        int c=0;
        for(int k=0;k<str.length();k++)
        {
            if(arr[j]==arr[k])
            c++;
        }
        hs.add(arr[j]+"="+c+",");
    }
        Iterator it=hs.iterator();
        while(it.hasNext())
        {
             System.out.print(it.next());
        }
  }
}