Как посчитать вхождение элемента в массив? [Дубликат]

1

Я написал класс, который приведен ниже, как показано, что

 public class Countletter 
 {
    public static void main(String args[]) throws IOException
    {        
      String str = "muhammed"; 
      char[] Array = str.toCharArray();

     for(int i=0;i<8;i++)
     {
       int count=1;
       for(int j=i+1;j<8;j++)
       {
        if(Array[i]==(Array[j]))
        {
            count++;
        }
       }
    System.out.println(""+Array[i]+":"+count);
    }
  }
}

Выход должен быть,

Input  : Muhammed

output : m=3
         u=1
         h=1
         a=1
         d=1

Но мой код печатает как

    output :  m:3
              u:1
              h:1
              a:1
              m:2
              m:1
              e:1
              d:1

кто-нибудь знает, где моя вина? и если кто-нибудь знает эту логику, пожалуйста, помогите мне

  • 0
    Кто-нибудь может дать пример кода для этого? Потому что я пытался много способов, но я не могу решить это, пожалуйста, помогите
  • 0
    Кто-то только что сделал ....
Теги:
arrays
for-loop
loops
logic

6 ответов

1
Лучший ответ

Ошибка состоит в том, что цикл не пропускает уже подсчитанные элементы, например, для m внешний цикл выполняется, когда

i=0 and gives count 3 for positions 0,4,5
 i=4 and gives count 2 for positions 4,5
 i=5 and gives count 1 for position 5

чтобы они не были скопированы снова, вы можете заменить их пробелом или любым специальным символом, как показано ниже.

public class Countletter 
 {
    public static void main(String args[]) throws IOException
    {        
      String str = "muhammed"; 
      char[] Array = str.toCharArray();

     for(int i=0;i<8;i++)
     {
         if(Array[i]!=' '){
          int count=1;
           for(int j=i+1;j<8;j++)
           {
            if(Array[i]==(Array[j]))
            {
             count++;
             Array[j]=' ';
            }
          }
        System.out.println(""+Array[i]+":"+count);
       }
    }
  }
}
1

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

Ответ, связанный с комментариями, использует Map но если вы не хотите использовать ее по какой-либо причине, существует несколько других методов. Моя первая мысль после карты была бы массивом подсчета символов.

int counts = new int[26];                 //Only counting lowercase letters
for(int i=0; i<counts.size(); i++)
    counts[i] = 0;                        //initialize all to 0
int a = 'a';                              //get the int representation of the first lowercase letter
str = str.toLowerCase();
for(int i = 0; i<str.length; i++){
    int let = ((int)str.charAt(i))-a;     //find the appropriate index in the count
    counts[let]++;                        //increment that letters count
}
for(int i =0; i<counts.size(); i++){
    if(c > 0)
        print(char(i+a) + ": " + c);      //only print the letters that exist
}

Это даст вам желаемый результат, хотя и в алфавитном порядке.

0

Вы должны использовать LinkedHashMap для подсчета символов. LinkedHashMap сохраняет порядок появления символов.

    String str = "muhammed"; 
    char[] array = str.toCharArray();
    Map<Character, Integer> countMap = new LinkedHashMap<Character, Integer>();
    for(char c:array) {
        Integer cnt = countMap.containsKey(c) ? countMap.get(c) + 1 : 1;
        countMap.put(c, cnt);
    }
    for(Map.Entry<Character, Integer> entry: countMap.entrySet()) {
        System.out.println("" + entry.getKey() + ": " + entry.getValue());
    }

вывод:

m: 3
u: 1
h: 1
a: 1
e: 1
d: 1
0

Хотя я настоятельно рекомендую вам использовать объект Map, как было предложено выше, вот что вы могли бы изменить в своем коде, чтобы он работал:

String str = "muhammed";
char[] Array = str.toCharArray();

List<String> countedLetters = new ArrayList<String>();

for (int i = 0; i < 8; i++) {
    int count = 1;
    if (!countedLetters.contains("" + Array[i])) {
        for (int j = i + 1; j < 8; j++) {
            if (Array[i] == Array[j]) {
                count++;
            }
        }
        countedLetters.add("" + Array[i]);
        System.out.println("" + Array[i] + ":" + count);
    }
}
0

Проблема в том, что ваша логика находит количество писем, счет которых уже принят. Он не показывает количество d, так как вы создали цикл, который проверяет i <7. Строка представляет собой 8-значную строку.

import java.io.IOException;

public class Countletter 
{
public static void main(String args[]) throws IOException
{        
  int flag = 0;
  String str = "muhammed"; 
  char[] Array = str.toCharArray();

 for(int i=0;i<8;i++)
 {
     flag = 0;

   for (int k = 0 ; k < i ; k++)
   {
       if (Array[k] == Array[i])
           {
           flag = 1;
           break;
           }
   }
   int count=1;

   for(int j=i+1;j<8;j++)
   {
    if(Array[i]==(Array[j]))
    {
        count++;
    }
   }
   if (flag != 1)
       System.out.println(""+Array[i]+":"+count);
  }
  }
}
0

Это логическая ошибка.

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

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

Код ниже поможет вам.

public class Countletter {
public static void main(String args[]) throws IOException {
    String str = "aaaabbbbabab";
    char[] Array = str.toCharArray();

    for (int i = 0; i < str.length(); i++) {
        int count = 1;
        boolean charCameAlready=check(Array,Array[i],i);
        if(charCameAlready==false){
            for (int j = i + 1; j < str.length(); j++) {
                if (Array[i] == (Array[j])) {
                    count++;
                }
            }
            System.out.println("" + Array[i] + ":" + count);
        }
    }
}

private static boolean check(char[] array, char c,int limit) {
    for(int i=0;i<limit;i++){
        if(array[i]==c){
            return true;
        }
    }
    return false;
}

}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню