Как найти слово в массиве строк с

You can define your own string.ContainsAny() and string.ContainsAll() methods. As a bonus, I’ve even thrown in a string.Contains() method that allows for case-insensitive comparison, etc.

public static class Extensions
{
    public static bool Contains(this string source, string value, StringComparison comp)
    {
        return source.IndexOf(value, comp) > -1;
    }

    public static bool ContainsAny(this string source, IEnumerable<string> values, StringComparison comp = StringComparison.CurrentCulture)
    {
        return values.Any(value => source.Contains(value, comp));
    }

    public static bool ContainsAll(this string source, IEnumerable<string> values, StringComparison comp = StringComparison.CurrentCulture)
    {
        return values.All(value => source.Contains(value, comp));
    }
}

You can test these with the following code:

    public static void TestExtensions()
    {
        string[] searchTerms = { "FOO", "BAR" };
        string[] documents = {
            "Hello foo bar",
            "Hello foo",
            "Hello"
        };

        foreach (var document in documents)
        {
            Console.WriteLine("Testing: {0}", document);
            Console.WriteLine("ContainsAny: {0}", document.ContainsAny(searchTerms, StringComparison.OrdinalIgnoreCase));
            Console.WriteLine("ContainsAll: {0}", document.ContainsAll(searchTerms, StringComparison.OrdinalIgnoreCase));
            Console.WriteLine();
        }
    }

I need to search a string in the string array. I dont want to use any for looping in it

string [] arr = {"One","Two","Three"};

string theString = "One"

I need to check whether theString variable is present in arr.

Neo's user avatar

Neo

3,3097 gold badges34 silver badges44 bronze badges

asked Nov 5, 2008 at 12:12

balaweblog's user avatar

0

Well, something is going to have to look, and looping is more efficient than recursion (since tail-end recursion isn’t fully implemented)… so if you just don’t want to loop yourself, then either of:

bool has = arr.Contains(var); // .NET 3.5

or

bool has = Array.IndexOf(arr, var) >= 0;

For info: avoid names like var – this is a keyword in C# 3.0.

jcolebrand's user avatar

jcolebrand

16.3k11 gold badges74 silver badges121 bronze badges

answered Nov 5, 2008 at 12:16

Marc Gravell's user avatar

Marc GravellMarc Gravell

1.0m261 gold badges2550 silver badges2888 bronze badges

Every method, mentioned earlier does looping either internally or externally, so it is not really important how to implement it. Here another example of finding all references of target string

       string [] arr = {"One","Two","Three"};
       var target = "One";
       var results = Array.FindAll(arr, s => s.Equals(target));

answered Nov 5, 2008 at 13:56

Tamir's user avatar

TamirTamir

2,50516 silver badges23 bronze badges

2

Does it have to be a string[] ? A List<String> would give you what you need.

List<String> testing = new List<String>();
testing.Add("One");
testing.Add("Two");
testing.Add("Three");
testing.Add("Mouse");
bool inList = testing.Contains("Mouse");

answered Nov 5, 2008 at 12:18

ZombieSheep's user avatar

ZombieSheepZombieSheep

29.5k12 gold badges66 silver badges114 bronze badges

bool exists = arr.Contains("One");

answered Nov 5, 2008 at 12:19

mohammedn's user avatar

mohammednmohammedn

2,9263 gold badges23 silver badges30 bronze badges

0

I think it is better to use Array.Exists than Array.FindAll.

answered Mar 26, 2010 at 11:53

Joe Cheri Ross's user avatar

0

Its pretty simple. I always use this code to search string from a string array

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";
int pos = Array.IndexOf(stringArray, value);
if (pos > -1)
{
    return true;
}
else
{
    return false;
}

answered Nov 6, 2013 at 10:15

Sharp Coders's user avatar

If the array is sorted, you can use BinarySearch. This is a O(log n) operation, so it is faster as looping. If you need to apply multiple searches and speed is a concern, you could sort it (or a copy) before using it.

answered Nov 5, 2008 at 12:19

GvS's user avatar

GvSGvS

51.9k16 gold badges101 silver badges139 bronze badges

Each class implementing IList has a method Contains(Object value). And so does System.Array.

answered Nov 5, 2008 at 12:18

VolkerK's user avatar

VolkerKVolkerK

95.2k20 gold badges163 silver badges226 bronze badges

1

Why the prohibition “I don’t want to use any looping”? That’s the most obvious solution. When given the chance to be obvious, take it!

Note that calls like arr.Contains(...) are still going to loop, it just won’t be you who has written the loop.

Have you considered an alternate representation that’s more amenable to searching?

  • A good Set implementation would perform well. (HashSet, TreeSet or the local equivalent).
  • If you can be sure that arr is sorted, you could use binary search (which would need to recurse or loop, but not as often as a straight linear search).

answered Nov 5, 2008 at 12:57

bendin's user avatar

bendinbendin

9,3941 gold badge39 silver badges37 bronze badges

You can use Find method of Array type. From .NET 3.5 and higher.

public static T Find<T>(
    T[] array,
    Predicate<T> match
)

Here is some examples:

// we search an array of strings for a name containing the letter “a”:
static void Main()
{
  string[] names = { "Rodney", "Jack", "Jill" };
  string match = Array.Find (names, ContainsA);
  Console.WriteLine (match);     // Jack
}
static bool ContainsA (string name) { return name.Contains ("a"); }

Here’s the same code shortened with an anonymous method:

string[] names = { "Rodney", "Jack", "Jill" };
string match = Array.Find (names, delegate (string name)
  { return name.Contains ("a"); } ); // Jack

A lambda expression shortens it further:

string[] names = { "Rodney", "Jack", "Jill" };
string match = Array.Find (names, n => n.Contains ("a"));     // Jack

answered Nov 7, 2014 at 14:09

Yuliia Ashomok's user avatar

Yuliia AshomokYuliia Ashomok

8,2162 gold badges60 silver badges69 bronze badges

At first shot, I could come up with something like this (but it’s pseudo code and assuming you cannot use any .NET built-in libaries). Might require a bit of tweaking and re-thinking, but should be good enough for a head-start, maybe?

int findString(String var, String[] stringArray, int currentIndex, int stringMaxIndex)
    {
    if currentIndex > stringMaxIndex 
       return (-stringMaxIndex-1);
    else if var==arr[currentIndex] //or use any string comparison op or function
       return 0;
    else 
       return findString(var, stringArray, currentIndex++, stringMaxIndex) + 1 ;
    }



    //calling code
    int index = findString(var, arr, 0, getMaxIndex(arr));

    if index == -1 printOnScreen("Not found");
    else printOnScreen("Found on index: " + index);

answered Nov 5, 2008 at 12:31

Salman Kasbati's user avatar

In C#, if you can use an ArrayList, you can use the Contains method, which returns a boolean:

if MyArrayList.Contains("One")

answered Nov 5, 2008 at 12:49

DOK's user avatar

DOKDOK

32.2k7 gold badges60 silver badges92 bronze badges

1

You can check the element existence by

arr.Any(x => x == "One")

answered Dec 5, 2014 at 8:55

Ahmad's user avatar

AhmadAhmad

8,52910 gold badges73 silver badges129 bronze badges

it is old one ,but this is the way i do it ,

enter code herevar result = Array.Find(names, element => element == “One”);

answered Jul 13, 2020 at 14:37

Ali's user avatar

AliAli

1,06216 silver badges21 bronze badges

I’m surprised that no one suggested using Array.IndexOf Method.

Indeed, Array.IndexOf has two advantages :

  • It allows searching if an element is included into an array,
  • It gets at the same time the index into the array.
int stringIndex = Array.IndexOf(arr, theString);
if (stringIndex >= 0)
{
    // theString has been found
}

Inline version :

if (Array.IndexOf(arr, theString) >= 0)
{
    // theString has been found
}

answered Jul 26, 2020 at 19:48

Using Contains()

string [] SomeArray = {"One","Two","Three"};
bool IsExist = SomeArray.Contains("One");
Console.WriteLine("Is string exist: "+ IsExist);

Using Find()

string [] SomeArray = {"One","Two","Three"};
var result = Array.Find(SomeArray, element => element == "One");
Console.WriteLine("Required string is: "+ result);

Another simple & traditional way, very useful for beginners to build logic.

string [] SomeArray = {"One","Two","Three"};
foreach (string value in SomeArray) {
    if (value == "One") { 
        Console.WriteLine("Required string is: "+ value);
    }
 }

answered Dec 24, 2022 at 19:45

Billu's user avatar

BilluBillu

2,67325 silver badges47 bronze badges

3 / 3 / 2

Регистрация: 01.10.2011

Сообщений: 249

1

Как осуществить в строковом массиве поиск именно слова, а не части слова?

19.03.2012, 01:27. Показов 4300. Ответов 8


Студворк — интернет-сервис помощи студентам

как осуществить в строковом массиве поиск именно слова(!), а не части слова.
Допустим, есть строка: “this is horosho”
Если я использую функцию strstr( , ); то у меня сначала программа ищет часть слова “th

is

“, а потом отдельное слово “is”.
Как исправить это?

Заранее всем спасибо



0



143 / 112 / 36

Регистрация: 14.04.2011

Сообщений: 261

19.03.2012, 01:48

2



1



3 / 3 / 2

Регистрация: 01.10.2011

Сообщений: 249

25.03.2012, 03:10

 [ТС]

3

Цитата
Сообщение от R136a1
Посмотреть сообщение

strcmp + strtok

R136a1, если Вас не затруднит, не могли бы Вы, пожалуйста, поподробнее объяснить суть идеи



0



Duha666

53 / 53 / 19

Регистрация: 10.03.2012

Сообщений: 138

25.03.2012, 05:29

4

Разбиваем полную строку на отдельные слова и каждое слово сравниваем с вашим:

C++
1
2
3
4
5
6
7
8
9
10
11
12
bool found = false; // нашли ли мы слово
pch = strtok (str," ,.-"); // str - ваша строка, " ,.-" - разделители слов. Наверное, стоит ещё добавить всякие !? и так далее
while (pch != NULL)
{
    if (strcmp(pch, yourword) == 0) // yourword - искомое слово
        found = true;
    pch = strtok (NULL, " ,.-");
}
if (found)
    printf("Found");
else
    printf("Not found");



1



MrCold

873 / 771 / 173

Регистрация: 11.01.2012

Сообщений: 1,942

25.03.2012, 07:15

5

Без strtok можно :

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
#include <cstring>
using namespace std;
 
int main(){
       char word[] = "first";  //   СЛОВО ДЛЯ ПОИСКА 
       char copyword[20] = "";
       
       size_t i = 0;
       size_t j = 0;
       size_t k = 0;
       size_t pos[20] = {0};
 
       //   СТРОКА ДЛЯ ПОИСКА 
       char string[] = "On the first call to strtok,returns a pointer to the first token in strToken";
 
while(string[i]){
 
 
        if(isalpha(string[i]))
 
            copyword[j++] = string[i];
 
        if(isalpha(string[i])&& !isalpha(string[i + 1])) { 
 
                          copyword[j] = ''; 
        
                   if(!strcmp(copyword,word)) {
 
                   pos[k++] = i - (strlen(copyword)) + 2; }
 
                   copyword[0] = '';j = 0;}
    i++;
}
 
        if(!pos) cout <<"Not found";
 
        else  { cout << "Found in " ;
 
           for(i = 0; i < k;i++)
 
                   cout    <<  pos[i] << "  ";
 
                   cout << " positions ";  }
 
}



1



3 / 3 / 2

Регистрация: 01.10.2011

Сообщений: 249

25.03.2012, 09:48

 [ТС]

6

Duha666,
MrCold,
спасибо огромное!



0



3 / 3 / 2

Регистрация: 01.10.2011

Сообщений: 249

02.04.2012, 10:55

 [ТС]

7

MrCold, можешь поподробнее объяснить принцип работы программы, пожалуйста?



0



MrCold

873 / 771 / 173

Регистрация: 11.01.2012

Сообщений: 1,942

02.04.2012, 12:02

8

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <cstring>
using namespace std;
 
int main(){
       char word[] = "first";  //   СЛОВО ДЛЯ ПОИСКА
       char copyword[20] = "";  //  СЮДА БУДЕМ КОПИРОВАТЬ СЛОВО 
       
       size_t i = 0;   // СЧЕТЧИК ОБЩИЙ ДЛЯ СТРОКИ 
       size_t j = 0;   // СЧЕТЧИК КОПИИ СЛОВА 
       size_t k = 0;    // СЧЕТЧИК  НАЙДЕННЫХ СЛОВ 
       size_t pos[20] = {0}; // МАССИВ ПОЗИЦИИ  НАЙДЕННЫХ СЛОВ 
 
       //   СТРОКА ДЛЯ ПОИСКА
             char string[] = "On the first call to strtok,returns a pointer to the first token in strToken";
 
while(string[i]){    // ПОКА НЕ КОНЧИТСЯ СТРОКА
 
 
        if(isalpha(string[i]))  // ЕСЛИ  СИМВОЛ СТРОКИ  БУКВА 
 
            copyword[j++] = string[i];  // НАЧИНАЕМ КОПИРОВАТЬ СЛОВО
 
        if(isalpha(string[i])&& !isalpha(string[i + 1])) {  // ЕСЛИ КОНЕЦ СЛОВА В СТРОКЕ
 
                          copyword[j] = '';     // ОБОЗНАЧИМ КОНЕЦ  КОПИИ СЛОВА 
       
                   if(!strcmp(copyword,word)) {    // ТЕПЕРЬ СРАВНИМ КОПИЮ СЛОВА СО СЛОВОМ ДЛЯ ПОИСКА
 
                    // ОТМЕЧАЕМ ПОЗИЦИЮ НАЙДЕННОГО СЛОВО  ПО ПЕРВОЙ БУКВЕ
                        pos[k++] = i - (strlen(copyword)) + 2; } // ЗАНОСИМ В МАССИВ ПОЗИЦИЙ 
 
                   copyword[0] = '';      // ЗДЕСЬ ОБНУЛИМ КОПИЮ СЛОВА 
 
                   j = 0;}    // ЗДЕСЬ ОБНУЛИМ СЧЕТЧИК БУКВ КОПИИ СЛОВА
    i++;    
}
 
        if(!pos) cout <<"Not found";    // ЕСЛИ НИЧЕГО НЕ ОТМЕТИЛОСЬ  ВЫВОД "НЕ НАЙДЕНО"
 
         // ЕСЛИ СЛОВА БЫЛИ ВЫВОДИМ ВСЕ ПОЗИЦИИ 
         else  { cout << "Found in " ;
 
           for(i = 0; i < k;i++)
 
                   cout    <<  pos[i] << "  "; 
 
                   cout << " positions ";  }
 
}



1



3 / 3 / 2

Регистрация: 01.10.2011

Сообщений: 249

02.04.2012, 12:11

 [ТС]

9

MrCold, спасибо. Теперь уж точно разобрался



0



Поиск подстроки

Последнее обновление: 02.03.2023

Функция find() возвращает индекс первого вхождения подстроки или отдельного символа в строке в виде значние я типа size_t:

#include <iostream>
#include <string>

int main()
{
    std::string text {"A friend in need is a friend indeed."};
    std::cout << text.find("ed") << std::endl;      // 14
    std::cout << text.find("friend") << std::endl;  // 2
    std::cout << text.find('d') << std::endl;     // 7
    std::cout << text.find("apple") << std::endl;  // 18446744073709551615
}

Если строка или символ не найдены (как в примере выше в последнем случае), то возвращается специальная константа std::string::npos,
которая представляет очень большое число (как видно из примера, число 18446744073709551615). И при поиске мы можем проверять результат функции find() на равенство этой константе:

if (text.find("banana") == std::string::npos)
{
    std::cout << "Not found" << std::endl;
}

Функция find имеет ряд дополнительных версий. Так, с помощью второго параметра мы можем указать индекс, с которого надо вести поиск:

#include <iostream>
#include <string>

int main()
{
    std::string text {"A friend in need is a friend indeed."};
    // поиск с 10-го индекса
    std::cout << text.find("friend", 10) << std::endl;      // 22
}

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

#include <iostream>
#include <string>

int main()
{
    std::string text {"A friend in need is a friend indeed."};
    std::string word {"friend"};
    unsigned count{};       // количество вхождений
    for (unsigned i {}; i <= text.length() - word.length(); )
    {
        // получаем индекс
        size_t position = text.find(word, i);
        // если не найдено ни одного вхождения с индекса i, выходим из цикла
        if (position == std::string::npos) break;
        // если же вхождение найдено, увеличиваем счетчик вхождений
        ++count;
        // переходим к следующему индексу после position
        i = position + 1;
    }
    std::cout << "The word is found " << count << " times." << std::endl; // The word is found 2 times.
}

Здесь в цикле пробегаемся по тексту, в котором надо найти строку, пока счетчик i не будет равен text.length() - word.length().
С помощью функции find() получаем индекс первого вхождения слова в тексте, начиная с индекса i. Если таких вхождений не найдено, то выходим из цикла.
Если же найден индекс, то счетчик i получает индекс, следующий за индексом найденного вхождения.

В итоге, поскольку искомое слово “friend” встречается в тексте два раза, то программа выведет

The word is found 2 times.

В качестве альтернативы мы могли бы использовать цикл while:

#include <iostream>
#include <string>

int main()
{
    std::string text {"A friend in need is a friend indeed."};
    std::string word {"friend"};
    unsigned count{};       // количество вхождений
    size_t index{}; // начальный индекс
    while ((index = text.find(word, index)) != std::string::npos)
    {
        ++count;
        index += word.length(); // перемещаем индекс на позицию после завершения слова в тексте
    }
    std::cout << "The word is found " << count << " times." << std::endl;
}

Еще одна версия позволяет искать в тексте не всю строку, а только ее часть. Для этого в качестве третьего параметра передается количество символов из искомой строки, которые программа будет искать в тексте:

#include <iostream>
#include <string>

int main()
{
    std::string text {"A friend in need is a friend indeed."};
    std::string word {"endless"};
    // поиск с 10-го индекса 3 первых символов слова "endless", то есть "end"
    std::cout << text.find("endless", 10, 3) << std::endl;      // 25
}

Стоит отметить, что в этом случае искомая строка должна представлять строковый литерал или строку в С-стиле (например, символьный массив с концевым нулевым байтом).

Функция rfind. Поиск в обратном порядке

Функция rfind() работает аналогично функции find(), принимает те же самые параметры, только ищет подстроку в обратном порядке – с конца строки:

#include <iostream>
#include <string>

int main()
{
    std::string text {"A friend in need is a friend indeed."};
    std::cout << text.rfind("ed") << std::endl;      // 33
    std::cout << text.rfind("friend") << std::endl; // 22
    std::cout << text.rfind('d') << std::endl;     // 34
    std::cout << text.rfind("apple") << std::endl;  // 18446744073709551615
}

Поиск любого из набора символов

Пара функций – find_first_of() и find_last_of() позволяют найти соответственно первый и последний индекс любого из набора символов:

#include <iostream>
#include <string>

int main()
{
    std::string text {"Phone number: +23415678901"};
    std::string letters{"0123456789"};  // искомые символы
    std::cout << text.find_first_of(letters) << std::endl;      // 15
    std::cout << text.find_last_of(letters) << std::endl;      // 25
}

В данном случае ищем в строке “Phone number: +23415678901” первую и последнюю позицию любого из символов из строки “0123456789”. То есть таким образом мы найдем начальный и конечный индекс
номера телефона.

Если нам, наоборот, надо найти позиции символов, которые НЕ представляют любой символ из набора, то мы можем использовать функции find_first_not_of() (первая позиция)
и find_last_not_of() (последняя позиция):

#include <iostream>
#include <string>

int main()
{
    std::string text {"Phone number: +23415678901"};
    std::string letters{"0123456789"};  // искомые символы
    std::cout << text.find_first_not_of(letters) << std::endl;      // 0
    std::cout << text.find_last_not_of(letters) << std::endl;      // 14
}

Мы можем комбинировать функции. Например, найдем количество слов в строке:

#include <iostream>
#include <string>

int main()
{
    std::string text {"When in Rome, do as the Romans do."};    // исходный текст
    const std::string separators{ " ,;:."!?'*n" }; // разделители слов
    unsigned count{};   // счетчик слов
    size_t start { text.find_first_not_of(separators) }; // начальный индекс первого слова
    while (start != std::string::npos) // если нашли слово
    {
        // увеличиваем счетчик слов
        count++;
        size_t end = text.find_first_of(separators, start + 1); // находим, где кончается слово
        if (end == std::string::npos) 
        {
            end = text.length();
        }
        start = text.find_first_not_of(separators, end + 1); // находим начальный индекс следующего слова и переустанавливаем start
    }
    // выводим количество слов
    std::cout << "Text contains " << count << " words" << std::endl;    // Text contains 8 words
}

Вкратце рассмотрим данный код. В качестве текста, где будем подсчитывать слова, определям переменную text. И также определяем строку разделителей, такие как знаки пунктуации, пробелы, символ перевода строки, которые не являются словами:

const std::string separators{ " ,;:."!?'*n" }; // разделители слов

Перед обработкой введенного текста фиксируем индекс первого символа первого слова в тексте. Для этого применяется функция find_first_not_of(), которая возвращает
первый индекс любого символа, который не входит в строку separators:

size_t start { text.find_first_not_of(separators) };

Далее в цикле while смотрим, является ли полученный индекс действительным индексом:

while (start != std::string::npos)

Например, если в строке одни только символы из набора separators, тогда функция find_first_not_of() возвратит значение std::string::npos,
что будет означать, что в тексте больше нет непунктационных знаков.

И если start указывает на действительный индекс начала слова, то увеличиваем счетчик слово. Далее находим индекс первого символа из separators, который идет сразу после слова. То есть фактически это индекс после
последнего символа слова, который помещаем в переменную end:

size_t end = text.find_first_of(separators, start + 1); // находим, где закончилось слово

Для нахождения позиции окончания слова используем функцию find_first_of(), которая возвращает первую позицию любого символа из separators, начиная с индекса start+1

Причем может быть, что функция find_first_of() не найдет ни одного символа из separators (например, слово является поседним в тексте, и после него нет никаких знаков пунктуации или пробелов),
в этом случае конечный индекс равен длине текста.

if (end == std::string::npos) // если НЕ найден ни один из символов-разделителей
    end = text.length();        // устанавливаем переменную end на конец текста

После того, как мы нашли начальный индексы слова и его конец, переустанавливаем start на начальный индекс следующего слова и повторяем действия цикла:

start = text.find_first_not_of(separators, end + 1); // находим начальный индекс следующего слова и переустанавливаем start

В конце выводим количество найденных слов.

Массивы строк. Примеры решения наиболее распространенных задач


Содержание

  • 1. Массив строк. Тип string[]. Создание массива строк
  • 2. Пример инициализации массива строк
  • 3. Пример ввода строк с клавиатуры и создания массива строк
  • 4. Пример сортировки массива строк методом вставки
  • 5. Пример поиска заданной строки в массиве строк
  • 6. Пример подсчета количества вхождений заданной строки в массиве строк
  • Связанные темы

Поиск на других ресурсах:

1. Массив строк. Тип string[]. Создание массива строк

В языке C# строки могут быть объединены в массив. Каждая строка представляется типом string.

Для создания массива строк нужно выполнить следующие шаги.

1. Объявить ссылку на тип string, например

string[] arrString;

где arrString – название ссылки;

2. Выделить память для массива

arrString = new string[size];

здесь size – количество строк (экземпляров) типа string.

 

2. Пример инициализации массива строк

Массив строк может быть инициализирован при его объявлении. Ниже приводится пример инициализации и вывод на экран массива daysOfWeek, определяющего дни недели.

using System;

namespace ConsoleApp8
{
  class Program
  {
    static void Main(string[] args)
    {
      // Инициализация массива строк
      string[] daysOfWeek = { "Sunday", "Monday", "Tuersday",
      "Wednesday", "Thirsday", "Friday", "Saturday" };

      // Вывод массива строк AS в цикле
      for (int i = 0; i < daysOfWeek.Length; i++)
        Console.WriteLine("AS[{0}] = {1}", i, daysOfWeek[i]);
      Console.ReadKey();
    }
  }
}

Результат выполнения программы

AS[0] = Sunday
AS[1] = Monday
AS[2] = Tuersday
AS[3] = Wednesday
AS[4] = Thirsday
AS[5] = Friday
AS[6] = Saturday

 

3. Пример ввода строк с клавиатуры и создания массива строк

В примере вводятся строки с клавиатуры до тех пор, пока не будет введена пустая строка «». Одновременно формируется массив строк, который выводится на экран после завершения ввода.

using System;

namespace ConsoleApp8
{
  class Program
  {
    static void Main(string[] args)
    {
      // Ввод строк с клавиатуры
      // и образование нового массива

      // 1. Объявление переменных
      string[] AS; // ссылка на массив строк
      int count; // текущее количество строк в массиве
      string s;
      string[] AS2; // дополнительная переменная-ссылка - сохраняет старый массив строк

      // 2. Цикл ввода строк
      Console.WriteLine("Enter strings:");

      count = 0; // обнулить количество строк
      AS = new string[count]; // выделить память для 0 строк

      do
      {
        // Ввести строку
        s = Console.ReadLine();

        // Проверка, пустая ли строка
        if (s!="")
        {
          // если строка не пустая, то добавить строку в массив
          count++;

          // предварительно выделить память для нового массива
          // в котором на 1 элемент больше
          AS2 = new string[count];

          // скопировать старый массив в новый
          for (int i = 0; i < AS2.Length - 1; i++)
            AS2[i] = AS[i];

          // добавить последнюю введенную строку в массив AS2
          AS2[count - 1] = s;

          // Освобождать память, предварительно выделенную под AS не нужно,
          // этим занимается сборщик мусора

          // перенаправить ссылку AS на AS2
          AS = AS2;
        }
      } while (s != "");

      // 3. Вывод массива строк AS в цикле
      for (int i = 0; i < AS.Length; i++)
        Console.WriteLine("AS[{0}] = {1}", i, AS[i]);
      Console.ReadKey();
    }
  }
}

Как видно из вышеприведенного кода, не нужно делать освобождение предварительно выделенной памяти для массива AS как в языках C/C++. Этим занимается сборщик мусора.

Результат работы программы

Enter strings:
abc
bcdef
ghi
jkl mno

AS[0] = abc
AS[1] = bcdef
AS[2] = ghi
AS[3] = jkl mno


 

4. Пример сортировки массива строк методом вставки

В примере демонстрируется ввод массива из n строк (n>0) и его сортировка методом вставки. Строки сортируются по возрастанию.

using System;

namespace ConsoleApp8
{
  class Program
  {
    static void Main(string[] args)
    {
      // Сортировка массива строк методом вставки
      // 1. Объявление переменных
      string[] AS; // массив строк
      int count; // количество элементов в массиве
      string s; // дополнительная переменная-строка

      // 2. Ввести количество строк
      Console.Write("count = ");
      count = Int32.Parse(Console.ReadLine());

      // 3. Выделить память для массива из count строк
      AS = new string[count];

      // 4. Ввести данные массива с клавиатуры
      Console.WriteLine("Enter array:");

      for (int i=0; i<AS.Length; i++)
      {
        Console.Write("AS[{0}] = ", i);
        AS[i] = Console.ReadLine();
      }

      // 5. Сортировка методом вставки
      for (int i = 0; i < AS.Length - 1; i++)
        for (int j = i; j >= 0; j--)
          if (String.Compare(AS[j], AS[j + 1]) > 0) // функция Compare()
          {
            // поменять значения местами
            s = AS[j];
            AS[j] = AS[j + 1];
            AS[j + 1] = s;
          }

      // 6. Вывести массив AS
      Console.WriteLine("Sorted array:");
      for (int i = 0; i < AS.Length; i++)
        Console.WriteLine("AS[{0}] = {1}", i, AS[i]);

      Console.ReadKey();
    }
  }
}

Как видно из вышеприведенного примера, для сравнения двух массивов используется функция Compare(). Эта функция возвращает число больше 0, если первая строка находится в лексикографическом порядке после второй строки. Если строки равны, функция возвращает нулевое значение.

Результат работы программы

count = 5
Enter array:
AS[0] = lkd
AS[1] = kbd
AS[2] = abcd
AS[3] = jklm nop
AS[4] = ffed

Sorted array:
AS[0] = abcd
AS[1] = ffed
AS[2] = jklm nop
AS[3] = kbd
AS[4] = lkd

 

5. Пример поиска заданной строки в массиве строк

В примере вводится массив строк и вводится некоторая строка. Если строка есть в массиве, то определяется ее позиция. Результат поиска выводится на экран.

using System;

namespace ConsoleApp8
{
  class Program
  {
    static void Main(string[] args)
    {
      // Поиск заданной строки в массиве строк
      // 1. Объявление переменных
      string[] AS; // массив строк
      int count; // количество элементов в массиве
      string str; // искомая строка

      // 2. Ввести количество строк
      Console.Write("count = ");
      count = Int32.Parse(Console.ReadLine());

      // 3. Проверка, корректно ли значение count
      if (count<=0)
      {
        Console.WriteLine("Error. The value of count is incorrect.");
        Console.ReadKey();
        return;
      }

      // 4. Выделить память для массива из count строк
      AS = new string[count];

      // 5. Ввести данные массива с клавиатуры
      Console.WriteLine("Enter array:");

      for (int i=0; i<AS.Length; i++)
      {
        Console.Write("AS[{0}] = ", i);
        AS[i] = Console.ReadLine();
      }

      // 6. Ввести строку символов
      Console.Write("Enter string: ");
      str = Console.ReadLine();

      // 7. Поиск строки в массиве строк
      bool f_is = false; // флаг, сигнализирующий о наличии строки в массиве
      int index = -1; // позиция строки в массиве

      for (int i = 0; i < AS.Length - 1; i++)
        if (str == AS[i])
        {
          f_is = true;
          index = i;
        }

      // 8. Вывод результата
      if (f_is)
      {
        Console.WriteLine("String "{0}" is in the array.", str);
        Console.WriteLine("Position is {0}", index);
      }
      else
      {
        Console.WriteLine("String "{0}" is not in the array.", str);
      }
      Console.ReadKey();
    }
  }
}

Результат работы программы

count = 7
Enter array:
AS[0] = sd
AS[1] = lkjl
AS[2] = wewe
AS[3] = ooii
AS[4] = slkdlk
AS[5] = cxx
AS[6] = lkl

Enter string: wewe
String "wewe" is in the array.
Position is 2

 

6. Пример подсчета количества вхождений заданной строки в массиве строк

В примере вводится строка и массив строк. Затем осуществляется подсчет количества вхождений заданной строки в массиве строк.

using System;

namespace ConsoleApp8
{
  class Program
  {
    static void Main(string[] args)
    {
      // Вычисление количества вхождений заданной строки в массиве строк
      // 1. Объявление переменных
      string[] AS; // массив строк
      int count; // количество элементов в массиве
      string str; // строка, количество вхождений которой вычисляется
      int n_occurs; // количество вхождений - результат

      // 2. Ввод строки str
      Console.WriteLine("Enter string:");
      str = Console.ReadLine();

      // 3. Ввод количества элементов в массиве
      Console.Write("count = ");
      count = Convert.ToInt32(Console.ReadLine());

      // 4. Проверка, корректно ли значение count
      if (count<=0)
      {
        Console.WriteLine("Error. The value of count is incorrect.");
        Console.ReadLine();
        return;
      }

      // 5. Выделение памяти для массива строк
      AS = new string[count];

      // 6. Ввод массива с клавиатуры
      Console.WriteLine("Enter the array AS:");

      for (int i=0;i<AS.Length;i++)
      {
        Console.Write("AS[{0}] = ", i);
        AS[i] = Console.ReadLine();
      }

      // 7. Подсчет количества вхождений
      n_occurs = 0;
      for (int i = 0; i < AS.Length; i++)
        if (str == AS[i])
          n_occurs++;

      // 8. Вывод результата
      Console.WriteLine("n_occurs = {0}", n_occurs);

      Console.ReadKey();
    }
  }
}

Результат выполнения программы

Enter string:
abc
count = 9

Enter the array AS:
AS[0] = dd
AS[1] = abc
AS[2] = ghi
AS[3] = jklm
AS[4] = abc
AS[5] = def
AS[6] = bca
AS[7] = abc
AS[8] = fklsdj
n_occurs = 3

 


Связанные темы

  • Одномерные массивы. Примеры решения задач на одномерные массивы. Массивы структур. Массивы классов. Инициализация массивов
  • Многомерные массивыСтупенчатые массивы. Инициализация многомерных массивов
  • Ссылки на массивы. Свойство LengthПрисваивание массивов
  • Неявно типизированные массивы. Ключевое слово var

 


Добавить комментарий