C # найти количество повторяющихся символов в массиве и перечислить их - PullRequest
0 голосов
/ 11 ноября 2018

Я пытаюсь найти количество повторяющихся символов в массиве и перечислить их. Например, пользователь вводит «это мой дом», вывод должен выглядеть так:

Количество повторяющихся символов: 3, а дубликаты: h i s

Я должен использовать ToCharArray ()

Я пытался, но не могу заставить его работать должным образом, не могли бы вы помочь?

Спасибо

Вот мой код:


using System;
class Program
{
    static void Main()
    {
        Console.Write("type a sentence: ");
        String str = Console.ReadLine();
        char[] arr = str.ToCharArray();

        for (int j = 0; j < arr.Length; j++)
        {
            for (int k = j + 1; k < arr.Length; k++)
            {
                if (arr[j] == arr[k] && j != k)
                {
                    Console.WriteLine("number of duplicates: " + k + "\n" + "duplicates are: " + arr[j]);
                    Console.ReadLine();
                }
            }
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 11 ноября 2018

Вот еще одно решение без linq:

static void Main(string[] args)
{
    string longText = @"your sentence comes here";
    foreach (var character in CharacterCount.Count(longText))
    {
        if(character.Value>1)
           Console.WriteLine("{0} - {1}", character.Key, character.Value);
    }    
}

class CharacterCount
{
    public static SortedDictionary<char, ulong> Count(string stringToCount)
    {
        SortedDictionary<char, ulong> characterCount = new SortedDictionary<char, ulong>();

        foreach (var character in stringToCount)
        {
            if (!characterCount.ContainsKey(character))
                characterCount.Add(character, 1);
            else
                characterCount[character]++;
        }
        return characterCount;
    }   
}  
0 голосов
/ 11 ноября 2018

Это может помочь.

    Console.Write("type a sentence: ");
    String str = Console.ReadLine();
    char[] arr = str.ToCharArray();

    int[] count = new int[10000];

    for (int j = 0; j < arr.Length; j++)
    {
        if( arr[j] >= 'a' && arr[j] <= 'z' || arr[j] >= 'A'&& arr[j] <= 'Z' )
        {
            count[arr[j]]++;
        }
    }

    int ans=0;
    for (int j = 0; j < count.Length; j++)
    {
        if(count[j]>1)
        {
            ans++;              
        }
    }

    Console.Write("Number of duplicates: " + ans +" duplicates are: ");

    for (int j = 0; j < count.Length; j++)
    {
        if(count[j]>1)
        {
            Console.Write((char)j +" " );
        }
    }
    Console.WriteLine();
}
0 голосов
/ 11 ноября 2018

Вы можете попробовать использовать linq вместо цикла for.

GroupBy создать группу и использовать where получить count больше 1.

var r= str.Replace(" ", "").GroupBy(_ => _).Where(x => x.Count() > 1).Select(x => x.Key);

затем используйте метод string.Join и linq count вместо цикла, чтобы получить ожидаемый результат.

Console.Write("type a sentence: ");
String str = Console.ReadLine();


var result = str.Replace(" ", "")
     .GroupBy(_ => _)
     .Where(x => x.Count() > 1)
     .Select(x => x.Key);


Console.WriteLine("number of duplicates: " + result.Count() + "\r" + "duplicates are: " + string.Join(" ",result));

c # online

Результат

type a sentence: number of duplicates: 3  duplicates are: h i s
...