Как проверить, содержат ли элементы массива определенную цифру?

У меня есть задача: реализовать метод FilterByDigit, который получает массив целых чисел, элементы которого содержат заданную цифру. Не используйте LINQ. Постановка задачи дается в XML-комментариях к этому методу.

Например, для массива {1, 2, 3, 4, 5, 6, 7, 68, 69, 70, 15, 17} => {7, 70, 17} для цифры = 7.

Может быть, я могу использовать Array.FindAll?

Моя собственная идея - использовать цикл и подсчитывать такие элементы, а затем изменять размер массива.

namespace FilterTask
{
    public static class ArrayExtension
    {
        public static bool IsContainDigit(int element, int digit)
        {
            if (element == 0 && digit == 0)
            {
                return true;
            }

            element = Math.Abs(element);
            while (element != 0)
            {
                if (digit == element % 10)
                {
                    return true;
                }

                element /= 10;
            }

            return false;
        }

        public static int[] FilterByDigit(int[]? source, int digit)
        {
            if (source == null)
            {
                throw new ArgumentNullException(nameof(source));
            }

            if (source.Length == 0)
            {
                throw new ArgumentException("Invalid size");
            }

            if (digit < 0 || digit > 9)
            {
                throw new ArgumentOutOfRangeException(nameof(digit));
            }

            int count = 0;
            for (int i = 0; i < source.Length; ++i)
            {
                if (IsContainDigit(source[i], digit))
                {
                    ++count;
                }
            }

            int[] answer = new int[count];
            int j = 0;
            for (int i = 0; i < source.Length; ++i)
            {
                if (IsContainDigit(source[i], digit))
                {
                    answer[j++] = source[i];
                }
            }

            return answer;
        }
    }
}

Не могли бы вы поделиться кодом и объяснить, что у вас не работает.

Guru Stron 05.07.2023 20:36

Почему я могу использовать Array.FindAll?" - не следил за вопросом. Array.FindAll не является частью LINQ, и вы можете использовать его, если хотите.

Guru Stron 05.07.2023 20:38

Добро пожаловать в Stack Overflow! Пожалуйста, опубликуйте свой код и покажите нам, что вы уже пробовали. Также ознакомьтесь со следующими рекомендациями о том, как задать хороший вопрос: stackoverflow.com/help/how-to-ask

codeMonkey 05.07.2023 20:45

Могу ли я упростить свой код, может быть, вы можете сказать мне, как я могу использовать Array.Findl?

Anton Koktysh 05.07.2023 21:03

Любое оправдание для «Не используйте LINQ»? Интересно, является ли ограничение «Не использовать LINQ» произвольным ограничением, например, для школьного задания, которое явно исключает использование любой предварительно созданной функции поиска/фильтрации, такой как Array.FindAll?

Wyck 05.07.2023 21:19
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
5
76
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Могу ли я упростить свой код, может быть, вы можете сказать мне, как я могу использовать Array.FindAll?

Вот, пожалуйста. Array.FindAll принимает предикат поиска и возвращает массив совпадающих элементов.

var ints = new[] { 1, 2, 3, 4, 5, 6, 7, 68, 69, 70, 15, 17 };
var findAll = Array.FindAll(ints, i1 => i1.ToString().Contains("7"));

Также вы можете проверить, как это реализовано @source.dot.net.

P.S.

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

Ответ принят как подходящий

Вы также можете использовать Array.FindAll с существующей функцией.

var found = Array.FindAll(i => IsContainDigit(i, someDigit));

После подсчета элементов вы можете создать новый массив соответствующего размера и заполнить его отфильтрованными элементами.

{
    public static class ArrayExtension
    {
        public static bool IsContainDigit(int element, int digit)
        {
            if (element == 0 && digit == 0)
        {
            return true;
        }

        element = Math.Abs(element);
        while (element != 0)
        {
            if (digit == element % 10)
            {
                return true;
            }

            element /= 10;
        }

        return false;
    }

    public static int[] FilterByDigit(int[] source, int digit)
    {
        if (source == null)
        {
            throw new ArgumentNullException(nameof(source));
        }

        if (source.Length == 0)
        {
            throw new ArgumentException("Invalid size");
        }

        if (digit < 0 || digit > 9)
        {
            throw new ArgumentOutOfRangeException(nameof(digit));
        }

        int count = 0;
        for (int i = 0; i < source.Length; ++i)
        {
            if (IsContainDigit(source[i], digit))
            {
                ++count;
            }
        }

        int[] answer = new int[count];
        int j = 0;
        for (int i = 0; i < source.Length; ++i)
        {
            if (IsContainDigit(source[i], digit))
            {
                answer[j++] = source[i];
            }
        }

        return answer;
    }
}

}

int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 68, 69, 70, 15, 17 };
int digit = 7;

int[] filteredNumbers = ArrayExtension.FilterByDigit(numbers, digit);

Console.WriteLine(string.Join(", ", filteredNumbers));  // Output: 7, 70, 17

Другие вопросы по теме