NotAComputerScienceStudent Ответов: 4

Как найти дубликаты в массиве символов


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

Редактировать
В основном я пытался сделать терминальную игру из fallout. Будет введен код доступа, и люди будут пытаться угадать его. При угадывании вам скажут, сколько из этих букв являются правильными и является ли длина слова правильной.

Я использую это для преобразования фактического слова в массив
char[] ActualChar = new char[WordLenght];

            while (ApproachingLenght < WordLenght) 
            {
                foreach (char Letter in Word)
                { 
                    ActualChar[ApproachingLenght] = Letter;
                    ApproachingLenght++;
                }
            }

Угадай в массиве
char[] GuessChar = new char[GuessLenght];
            while (ApproachingGuessLenght < GuessLenght)
            {
                foreach (char Letter in Guess)
                {
                    GuessChar[ApproachingGuessLenght] = Letter;
                    ApproachingGuessLenght++;
                }
            }

Это делается для проверки сходства между двумя массивами, однако я получаю здесь проблему в основном, если фактическое слово "Привет" и угадать "Хелли", то он скажет, что 6 символов похожи, а не 4. Я обнаружил, что проблема заключается в том, что 2 л, так как "abcd, asdf" не имели этой проблемы.
if(GuessLenght == WordLenght)
            {
                //Check Each Element


                for (int i = 0; i < WordLenght; i++)
                {
                    for(int p = 0; p < WordLenght; p++)
                    {
                        if (GuessChar[i] == ActualChar[p])
                        {
                            LetterGuessed++;
                        }
                    }
                }
                
            }
            else
            {
                if(GuessLenght> WordLenght)
                {
                    Console.WriteLine("Wrong Lenght, Actual Lenght is : Shorter");
                }
                else
                {
                    Console.WriteLine("Wrong Lenght, Actual Lenght is : Longer");
                }
            }


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

Что я уже пробовал:

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);
    }    

Это я нашел в интернете и просто добавил его.

Afzaal Ahmad Zeeshan

Что это CharacterCount.Count метод?

PIEBALDconsult

Непонятный.
Сколько символов дублируется?
Или сколько всего дубликатов символов существует?
Пожалуйста, предоставьте образец ввода и вывода.

PIEBALDconsult

Увидев вашу правку... Подумайте еще раз. Вам не нужно сосредотачиваться на дубликатах.
Но я все еще не понимаю цели, все, что я знаю, это то, что F("Привет","Хелли") - это не 6.

4 Ответов

Рейтинг:
26

AnkushK1

var duplicateDict = new Dictionary<char, int>();
		string longText = @"your sentence comes here";
		foreach (var ch in longText)
		{
			if (duplicateDict.ContainsKey(ch))
			{
				duplicateDict[ch]++;
			}
			else
			{
				duplicateDict.Add(ch, 1);
			}
		}

		foreach (var ch in duplicateDict.Where(x => x.Value > 1))
		{
			Console.WriteLine(string.Format("Duplicate Character {0}, Count {1}", ch.Key, ch.Value));
		}


PIEBALDconsult

Лучше не делать за них домашнюю работу.
И это можно улучшить.

Maciej Los

Словарь-это хорошая идея!
5ed!

NotAComputerScienceStudent

это не домашнее задание, мне больше нечего делать в карантине, я студент-механик.

Maciej Los

Извините, но вы ответили не тому человеку...
Кстати: вы видели мое решение?

Рейтинг:
19

Maciej Los

Если вы хотите получить только дубликаты...

string longText = @"your sentence comes here";
Dictionary<char, int> result = longText
	.GroupBy(x=>x)
	.Select(grp => new KeyValuePair<char, int>(grp.Key, grp.Count()))
	.Where(kvp=> kvp.Value>1)
	.OrderByDescending(kvp=> kvp.Value)
	.ToDictionary(kvp=> kvp.Key, kvp=>kvp.Value);
	
foreach(KeyValuePair<char, int> kvp in result)
	Console.WriteLine($"'{kvp.Key}' => {kvp.Value}" );


Maciej Los

Вы имеете в виду пространство имен: System.В LINQ
Видеть: Перечислимый.Метод GroupBy (System.Linq) | Microsoft Docs[^]

NotAComputerScienceStudent

Он работал

Maciej Los

Я рад.
Это решает вашу проблему?

Рейтинг:
1

PIEBALDconsult

Ну, если ты это сделаешь этот иначе тебя вышвырнут из класса.:

System.Text.RegularExpressions.Regex reg =
  new System.Text.RegularExpressions.Regex
  (
    @"(?i)^
    ((?'A'A)|(?'B'B)|(?'C'C)|(?'D'D)|(?'E'E)
    |(?'F'F)|(?'G'G)|(?'H'H)|(?'I'I)|(?'J'J)
    |(?'K'K)|(?'L'L)|(?'M'M)|(?'N'N)|(?'O'O)
    |(?'P'P)|(?'Q'Q)|(?'R'R)|(?'S'S)|(?'T'T)
    |(?'U'U)|(?'V'V)|(?'W'W)|(?'X'X)|(?'Y'Y)
    |(?'Z'Z)|(?'Other'.))*$"
  ,
    System.Text.RegularExpressions.RegexOptions.Compiled
    |
    System.Text.RegularExpressions.RegexOptions.ExplicitCapture
    |
    System.Text.RegularExpressions.RegexOptions.IgnorePatternWhitespace
  ) ;

string[] n = reg.GetGroupNames() ;

System.Text.RegularExpressions.MatchCollection mat =
  reg.Matches ( "The quick brown fox jumps over the lazy dog." ) ;

for ( int i = 0 ; i < mat.Count ; i++ )
{
  for ( int g = 1 ; g < n.Length ; g++ )
  {
    System.Console.WriteLine ( "{0} {1}" , n [ g ] , mat [ i ] .Groups [ n [ g ] ].Captures.Count ) ;
  }
}


Рейтинг:
0

BillWoodruff

var uniqueChars = longText.Distinct();

foreach (var ch in uniqueChars)
{
    Console.WriteLine(
        $"char: {ch} char ascii value: {(int)ch} instances: {longText.Count(c => c == ch)}\r\n");
}

Console.WriteLine($"nduplicates: {longText.Count() - uniqueChars.Count()}");
характер.Ключ и характер.Значение-это не C#.


Maciej Los

5ed!