//Метод работает с minMaxDistance, занося туда информацию о минимальном и максимальном расстоянии
        //Запоминаем позицию первого вхождение слова, и текущую позицию
        //При нахождении одного из заданных слов:
        //    сравниваем позицию первого вхождения текущего слова и текущую позицию текущего слова
        //    с позицией первого вхождения другого слова и последней позицией другого слова
        private void ProcessMinMaxDistance(ref MinMaxDistance minMaxDistance,
                                           MinMaxPosition wordPos, MinMaxPosition otherWordPos,
                                           int pos)
        {
            if (wordPos.Min == -1)
            {
                wordPos.Min = pos;
            }
            wordPos.Max = pos;
            var currentDistances = GetMinMaxDistance(wordPos, otherWordPos);

            if (currentDistances == null)
            {
                return;
            }

            if (minMaxDistance.Min == -1)
            {
                minMaxDistance.Min = currentDistances.Min;
            }
            else if (currentDistances.Min < minMaxDistance.Min)
            {
                minMaxDistance.Min = currentDistances.Min;
            }

            if (minMaxDistance.Max == -1)
            {
                minMaxDistance.Max = currentDistances.Max;
            }
            else if (currentDistances.Max > minMaxDistance.Max)
            {
                minMaxDistance.Max = currentDistances.Max;
            }
        }
        public MinMaxDistance Get(string filename, string firstWord, string secondWord)
        {
            int            pos           = 0;
            MinMaxPosition firstWordPos  = new MinMaxPosition();
            MinMaxPosition secondWordPos = new MinMaxPosition();

            MinMaxDistance minMaxDistance = new MinMaxDistance();

            FileHelper fileHelper = new FileHelper(filename);

            firstWord  = firstWord.ToLower();
            secondWord = secondWord.ToLower();

            while (!fileHelper.IsEnd())
            {
                string[] words = fileHelper.GetNextWordsInLine();

                foreach (var word in words)
                {
                    pos++;

                    if (word == firstWord)
                    {
                        ProcessMinMaxDistance(ref minMaxDistance, firstWordPos, secondWordPos, pos);
                    }
                    else if (word == secondWord)
                    {
                        ProcessMinMaxDistance(ref minMaxDistance, secondWordPos, firstWordPos, pos);
                    }
                }
            }

            return(minMaxDistance);
        }
        private MinMaxDistance GetMinMaxDistance(MinMaxPosition firstWordPos, MinMaxPosition secondWordPos)
        {
            MinMaxDistance minMaxDistance = new MinMaxDistance();

            List <int> firstWordPosList  = firstWordPos.getAllPos();
            List <int> secondWordPosList = secondWordPos.getAllPos();

            if (firstWordPosList.Count == 0 || secondWordPosList.Count == 0)
            {
                return(null);
            }

            minMaxDistance.Min = GetMinDistance(firstWordPosList, secondWordPosList);
            minMaxDistance.Max = GetMaxDistance(firstWordPosList, secondWordPosList);

            return(minMaxDistance);
        }
Beispiel #4
0
        static void Main(string[] args)
        {
            const string filename   = "input.txt";
            const string firstWord  = "я";
            const string secondWord = "сказать";

            MinMaxDistanceProcessor distanceProcessor = new MinMaxDistanceProcessor();
            MinMaxDistance          minMaxDistance    = distanceProcessor.Get(filename, firstWord, secondWord);

            int minDistance = minMaxDistance.Min;
            int maxDistance = minMaxDistance.Max;

            string minDistanceString = minDistance == -1 ? "Не существует" : minDistance.ToString();
            string maxDistanceString = maxDistance == -1 ? "Не существует" : maxDistance.ToString();

            Console.WriteLine($"min distance: {minDistanceString}\n" +
                              $"max distance: {maxDistanceString}");
        }