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

For example I have:

char buff[1000];

I want to search if the string “hassasin” is in that char array. Here is what I have tried.

char word[8] = "hassasin";
char Buffer[1000]=sdfhksfhkasd/./.fjka(hassasin)hdkjfakjsdfhkksjdfhkjh....etc 
int k=0;
int t=0; 
int len=0; 
int sor=0; 
for (k=0; k<1000; k++){ 
    for (t=0; t<8; t++){ 
        if (Buffer[k]==word[t]) len++; 
        if (len==8) "it founds 0.9.1" 
    } 
}

asked Nov 19, 2012 at 9:23

hassasin's user avatar

hassasinhassasin

1411 gold badge1 silver badge7 bronze badges

3

Yes, you can just use strstr for this:

 #include <stdlib.h>
 #include <string.h>

 char buff[1000];
 char *s;

 s = strstr(buff, "hassasin");      // search for string "hassasin" in buff
 if (s != NULL)                     // if successful then s now points at "hassasin"
 {
     printf("Found string at index = %dn", s - buff);
 }                                  // index of "hassasin" in buff can be found by pointer subtraction
 else
 {
     printf("String not foundn");  // `strstr` returns NULL if search string not found
 }

answered Nov 19, 2012 at 9:26

Paul R's user avatar

Paul RPaul R

208k36 gold badges386 silver badges555 bronze badges

2

if the chararray contains stringend or do not end with you can use these code, because strstr will brake on these ones:

#include <stdio.h>
int main()
{
    char c_to_search[5] = "asdf";

    char text[68] = "hello my name is  there is some other string behind it n asdf";

    int pos_search = 0;
    int pos_text = 0;
    int len_search = 4;
    int len_text = 67;
    for (pos_text = 0; pos_text < len_text - len_search;++pos_text)
    {
        if(text[pos_text] == c_to_search[pos_search])
        {
            ++pos_search;
            if(pos_search == len_search)
            {
                // match
                printf("match from %d to %dn",pos_text-len_search,pos_text);
                return;
            }
        }
        else
        {
           pos_text -=pos_search;
           pos_search = 0;
        }
    }
    // no match
    printf("no matchn");
   return 0;
}

http://ideone.com/2In3mr

answered Nov 19, 2012 at 9:41

phschoen's user avatar

phschoenphschoen

2,02116 silver badges25 bronze badges

6

I have this string array:

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";

I would like to determine if stringArray contains value. If so, I want to locate its position in the array.

I don’t want to use loops. Can anyone suggest how I might do this?

Leigh's user avatar

Leigh

28.8k10 gold badges54 silver badges103 bronze badges

asked Oct 23, 2011 at 16:17

MoShe's user avatar

You could use the Array.IndexOf method:

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";
int pos = Array.IndexOf(stringArray, value);
if (pos > -1)
{
    // the array contains the string and the pos variable
    // will have its position in the array
}

Niklas's user avatar

Niklas

12.9k22 gold badges79 silver badges119 bronze badges

answered Oct 23, 2011 at 16:20

Darin Dimitrov's user avatar

Darin DimitrovDarin Dimitrov

1.0m270 gold badges3284 silver badges2923 bronze badges

4

var index = Array.FindIndex(stringArray, x => x == value)

answered Oct 23, 2011 at 22:53

BLUEPIXY's user avatar

BLUEPIXYBLUEPIXY

39.6k7 gold badges33 silver badges70 bronze badges

4

We can also use Exists:

string[] array = { "cat", "dog", "perl" };

// Use Array.Exists in different ways.
bool a = Array.Exists(array, element => element == "perl");
bool c = Array.Exists(array, element => element.StartsWith("d"));
bool d = Array.Exists(array, element => element.StartsWith("x"));

Matthias Braun's user avatar

answered May 7, 2015 at 15:05

Taran's user avatar

TaranTaran

2,78524 silver badges22 bronze badges

3

EDIT: I hadn’t noticed you needed the position as well. You can’t use IndexOf directly on a value of an array type, because it’s implemented explicitly. However, you can use:

IList<string> arrayAsList = (IList<string>) stringArray;
int index = arrayAsList.IndexOf(value);
if (index != -1)
{
    ...
}

(This is similar to calling Array.IndexOf as per Darin’s answer – just an alternative approach. It’s not clear to me why IList<T>.IndexOf is implemented explicitly in arrays, but never mind…)

answered Oct 23, 2011 at 16:18

Jon Skeet's user avatar

Jon SkeetJon Skeet

1.4m859 gold badges9093 silver badges9168 bronze badges

6

You can use Array.IndexOf() – note that it will return -1 if the element has not been found and you have to handle this case.

int index = Array.IndexOf(stringArray, value);

answered Oct 23, 2011 at 16:21

BrokenGlass's user avatar

BrokenGlassBrokenGlass

157k28 gold badges284 silver badges334 bronze badges

you can try like this…you can use Array.IndexOf() , if you want to know the position also

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

answered Oct 23, 2011 at 16:22

Glory Raj's user avatar

Glory RajGlory Raj

17.3k27 gold badges99 silver badges200 bronze badges

IMO the best way to check if an array contains a given value is to use System.Collections.Generic.IList<T>.Contains(T item) method the following way:

((IList<string>)stringArray).Contains(value)

Complete code sample:

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";
if (((IList<string>)stringArray).Contains(value)) Console.WriteLine("The array contains "+value);
else Console.WriteLine("The given string was not found in array.");

T[] arrays privately implement a few methods of List<T>, such as Count and Contains. Because it’s an explicit (private) implementation, you won’t be able to use these methods without casting the array first. This doesn’t only work for strings – you can use this trick to check if an array of any type contains any element, as long as the element’s class implements IComparable.

Keep in mind not all IList<T> methods work this way. Trying to use IList<T>‘s Add method on an array will fail.

answered Feb 10, 2014 at 10:44

pKami's user avatar

pKamipKami

3592 silver badges8 bronze badges

3

Use System.Linq

stringArray.Contains(value3);

answered Nov 23, 2021 at 11:07

Erhan Urun's user avatar

Erhan UrunErhan Urun

2193 silver badges8 bronze badges

You can try this, it looks up for the index containing this element, and it sets the index number as the int, then it checks if the int is greater then -1, so if it’s 0 or more, then it means it found such an index – as arrays are 0 based.

string[] Selection = {"First", "Second", "Third", "Fourth"};
string Valid = "Third";    // You can change this to a Console.ReadLine() to 
    //use user input 
int temp = Array.IndexOf(Selection, Valid); // it gets the index of 'Valid', 
                // in our case it's "Third"
            if (temp > -1)
                Console.WriteLine("Valid selection");
            }
            else
            {
                Console.WriteLine("Not a valid selection");
            }

answered Apr 13, 2017 at 4:41

Mayer Spitz's user avatar

Mayer SpitzMayer Spitz

2,5571 gold badge20 silver badges26 bronze badges

string x ="Hi ,World";
string y = x;
char[] whitespace = new char[]{ ' ',t'};          
string[] fooArray = y.Split(whitespace);  // now you have an array of 3 strings
y = String.Join(" ", fooArray);
string[] target = { "Hi", "World", "VW_Slep" };

for (int i = 0; i < target.Length; i++)
{
    string v = target[i];
    string results = Array.Find(fooArray, element => element.StartsWith(v, StringComparison.Ordinal));
    //
    if (results != null)
    { MessageBox.Show(results); }

}

answered Mar 20, 2016 at 15:13

user5248404's user avatar

I created an extension method for re-use.

   public static bool InArray(this string str, string[] values)
    {
        if (Array.IndexOf(values, str) > -1)
            return true;

        return false;
    }

How to call it:

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";
if(value.InArray(stringArray))
{
  //do something
}

answered Oct 13, 2016 at 14:32

james31rock's user avatar

james31rockjames31rock

2,5952 gold badges20 silver badges25 bronze badges

1

string[] strArray = { "text1", "text2", "text3", "text4" };
string value = "text3";

if(Array.contains(strArray , value))
{
    // Do something if the value is available in Array.
}

answered Aug 2, 2014 at 4:07

Jaydeep Bhatt's user avatar

1

The simplest and shorter method would be the following.

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";

if(stringArray.Contains(value))
{
    // Do something if the value is available in Array.
}

answered Jun 11, 2013 at 6:05

Priyank Gajera's user avatar

1

Алгоритмы поиска в строке

Время на прочтение
4 мин

Количество просмотров 176K

Постановка задачи поиска в строке

Часто приходится сталкиваться со специфическим поиском, так называемым поиском строки (поиском в строке). Пусть есть некоторый текст Т и слово (или образ) W. Необходимо найти первое вхождение этого слова в указанном тексте. Это действие типично для любых систем обработки текстов. (Элементы массивов Т и W – символы некоторого конечного алфавита – например, {0, 1}, или {a, …, z}, или {а, …, я}.)

Наиболее типичным приложением такой задачи является документальный поиск: задан фонд документов, состоящих из последовательности библиографических ссылок, каждая ссылка сопровождается «дескриптором», указывающим тему соответствующей ссылки. Надо найти некоторые ключевые слова, встречающиеся среди дескрипторов. Мог бы иметь место, например, запрос «Программирование» и «Java». Такой запрос можно трактовать следующим образом: существуют ли статьи, обладающие дескрипторами «Программирование» и «Java».

Поиск строки формально определяется следующим образом. Пусть задан массив Т из N элементов и массив W из M элементов, причем 0<M≤N. Поиск строки обнаруживает первое вхождение W в Т, результатом будем считать индекс i, указывающий на первое с начала строки (с начала массива Т) совпадение с образом (словом).
Пример. Требуется найти все вхождения образца W = abaa в текст T=abcabaabcabca.

Образец входит в текст только один раз, со сдвигом S=3, индекс i=4.

Алгоритм прямого поиска

Идея алгоритма:
1. I=1,
2. сравнить I-й символ массива T с первым символом массива W,
3. совпадение → сравнить вторые символы и так далее,
4. несовпадение → I:=I+1 и переход на пункт 2,

Условие окончания алгоритма:
1. подряд М сравнений удачны,
2. I+M>N, то есть слово не найдено.

Сложность алгоритма:
Худший случай. Пусть массив T→{AAA….AAAB}, длина │T│=N, образец W→{A….AB}, длина │W│=M. Очевидно, что для обнаружения совпадения в конце строки потребуется произвести порядка N*M сравнений, то есть O(N*M).

Недостатки алгоритма:
1. высокая сложность — O(N*M), в худшем случае – Θ((N-M+1)*M);
2. после несовпадения просмотр всегда начинается с первого символа образца и поэтому может включать символы T, которые ранее уже просматривались (если строка читается из вторичной памяти, то такие возвраты занимают много времени);
3. информация о тексте T, получаемая при проверке данного сдвига S, никак не используется при проверке последующих сдвигов.

Алгоритм Д. Кнута, Д. Мориса и В. Пратта (КМП-поиск)

Алгоритм КМП-поиска фактически требует только порядка N сравнений даже в самом плохом случае.
Пример.
(Символы, подвергшиеся сравнению, подчеркнуты.)

После частичного совпадения начальной части образа W с соответствующими символами строки Т мы фактически знаем пройденную часть строки и может «вычислить» некоторые сведения (на основе самого образа W), с помощью которых потом быстро продвинемся по тексту.

Идея КМП-поиска – при каждом несовпадении двух символов текста и образа образ сдвигается на все пройденное расстояние, так как меньшие сдвиги не могут привести к полному совпадению.

Особенности КМП-поиска:
1. требуется порядка (N+M) сравнений символов для получения результата;
2. схема КМП-поиска дает подлинный выигрыш только тогда, когда неудаче предшествовало некоторое число совпадений. Лишь в этом случае образ сдвигается более чем на единицу. К несчастью совпадения встречаются значительно реже чем несовпадения. Поэтому выигрыш от КМП-поиска в большинстве случаев текстов весьма незначителен.

Алгоритм Р. Боуера и Д. Мура (БМ-поиск)

На практике алгоритм БМ-поиска наиболее эффективен, если образец W длинный, а мощность алфавита достаточно велика.

Идея БМ-поиска – сравнение символов начинается с конца образца, а не с начала, то есть сравнение отдельных символов происходит справа налево. Затем с помощью некоторой эвристической процедуры вычисляется величина сдвига вправо s. И снова производится сравнение символов, начиная с конца образца.

Этот метод не только улучшает обработку самого плохого случая, но и даёт выигрыш в промежуточных ситуациях.
Почти всегда, кроме специально построенных примеров, БМ-поиск требует значительно меньше N сравнений. В самых же благоприятных обстоятельствах, когда последний символ образца всегда попадает на несовпадающий символ текста, число сравнений равно (N / M), в худшем же случае – О((N-M+1)*M+ p), где p – мощность алфавита.

Алгоритм Рабина-Карпа (РК-поиск)

Пусть алфавит D={0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, то есть каждый символ в алфавите есть d–ичная цифра, где d=│D│.

Пример. Пусть образец имеет вид W = 3 1 4 1 5
Вычисляем значения чисел из окна длины |W|=5 по mod q, q — простое число.

23590(mod 13)=8, 35902(mod 13)=9, 59023(mod 13)=9, …
k1=314157(mod 13) – вхождение образца,
k2=673997(mod 13) – холостое срабатывание.

Из равенства ki= kj (mod q) не следует, что ki= kj (например, 31415=67399(mod 13), но это не значит, что 31415=67399). Если ki= kj (mod q), то ещё надо проверить, совпадают ли строки W[1…m] и T[s+1…s+m] на самом деле.
Если простое число q достаточно велико, то дополнительные затраты на анализ холостых срабатываний будут невелики.
В худшем случае время работы алгоритма РК — Θ((N-M+1)*M), в среднем же он работает достаточно быстро – за время О(N+M).

Пример: Сколько холостых срабатываний k сделает алгоритм РК, если
q= 11, 13, 17. Пусть W={2 6}

26 mod 11=4 → k =3 холостых срабатывания,
26 mod 13=0 → k =1 холостое срабатывание,
26 mod 17=9 → k =0 холостых срабатываний.

Очевидно, что количество холостых срабатываний k является функцией от величины простого числа q (если функция обработки образца mod q) и, в общем случае, от вида функции для обработки образца W и текста Т.

В этом посте будет обсуждаться, как проверить, содержит ли примитив или массив объектов определенное значение или нет в Java.

1. Линейный поиск

Наивное решение состоит в том, чтобы выполнить линейный поиск в заданном массиве, чтобы проверить, присутствует ли конкретное значение в массиве или нет.

⮚ Для примитивных массивов

// Метод проверки, содержит ли примитивный массив определенное значение

public static boolean isPresent(int[] a, int target)

{

    for (int i: a)

    {

        if (target == i) {

            return true;

        }

    }

    return false;

}

⮚ Для массивов объектов

// Общий метод для проверки, содержит ли массив объектов определенное значение

public static<T> boolean isPresent(T[] a, T target)

{

    for (T s: a)

    {

        if (target.equals(s)) {

            return true;

        }

    }

    return false;

}

2. Использование потока Java 8

Мы можем использовать Java 8 Stream, чтобы проверить, содержит ли массив определенное значение, как показано ниже:

⮚ Для примитивных массивов

// Метод проверки, содержит ли примитивный массив определенное значение

public static boolean isPresent(int[] a, int target)

{

    return Arrays.stream(a)

                .anyMatch(x -> x == target);

}

Или с помощью фильтров:

// Метод проверки, содержит ли примитивный массив определенное значение

public static boolean isPresent(int[] a, int target)

{

    return Arrays.stream(a)

                .filter(x -> x == target)

                .count() > 0;

}

⮚ Для массивов объектов

// Общий метод для проверки, содержит ли массив объектов определенное значение

public static<T> boolean isPresent(T[] a, T target)

{

    return Arrays.stream(a)

                .anyMatch(x -> target.equals(x));    // или используйте `target::equals`

}

Или с помощью фильтров:

// Общий метод для проверки, содержит ли массив объектов определенное значение

public static<T> boolean isPresent(T[] a, T target)

{

    return Arrays.stream(a)

                .filter(x -> target.equals(x))        // или используйте `target::equals`

                .count() > 0;

}

3. Преобразовать в набор или список

Идея состоит в том, чтобы обернуть данный массив в список и использовать List.contains() который возвращает true если этот список содержит указанный элемент. Мы также можем использовать set вместо List.

⮚ Для примитивных массивов

Проверьте, как преобразовать примитивный целочисленный массив в список?

// Метод проверки, содержит ли примитивный массив определенное значение

public static boolean isPresent(int[] a, int target)

{

    return Arrays.stream(a)                 // IntStream

                .boxed()                    // Stream<Integer>

                .collect(Collectors.toList())  // List<Integer>

                .contains(target);

}

⮚ Для массивов объектов

// Общий метод для проверки, содержит ли массив объектов определенное значение

public static<T> boolean isPresent(T[] a, T target) {

    return Arrays.asList(a).contains(target);

}

4. Алгоритм бинарного поиска

Для отсортированных массивов мы можем использовать бинарный поиск для поиска в массиве определенного значения. Алгоритм бинарного поиска возвращает индекс указанного элемента, присутствующего в массиве; в противном случае возвращается отрицательное значение. Мы можем определить, содержит ли массив элемент, просто проверив, больше ли вычисленный индекс или равен нулю.

⮚ Для примитивных массивов

// Метод проверки, содержит ли примитивный массив определенное значение

public static int find(int[] a, int target) {

    return Arrays.binarySearch(a, target) >= 0;

}

⮚ Для массивов объектов

// Общий метод для проверки, содержит ли массив объектов определенное значение

public static<T> int find(T[] a, T target) {

    return Arrays.binarySearch(a, target) >= 0;

}

5. Использование Apache Commons Lang

Apache Commons Ланг ArrayUtils класс содержит несколько статических служебных методов, которые работают с массивами примитивов или объектов. Он обеспечивает contains() метод, который проверяет, присутствует ли заданное значение в массиве или нет.

⮚ Для примитивных массивов

// Метод проверки, содержит ли примитивный массив определенное значение

public static boolean isPresent(int[] a, int target) {

    return ArrayUtils.contains(a, target);

}

⮚ Для массивов объектов

// Общий метод для проверки, содержит ли массив объектов определенное значение

public static<T> boolean isPresent(T[] a, T target) {

    return ArrayUtils.contains(a, target);

}

6. Использование библиотеки Guava

⮚ Для примитивных массивов

Библиотека Guava предоставляет несколько служебных классов, относящихся к примитивам, например Ints для инт, Longs надолго, Doubles на двоих, Floats для поплавка, Booleans для логического значения и так далее.

Каждый класс полезности имеет indexOf() метод, который возвращает индекс первого появления цели в массиве. Мы можем определить, содержит ли массив элемент, проверив, больше ли возвращаемый индекс или равен нулю.

// Метод проверки, содержит ли примитивный массив определенное значение

public static boolean find(int[] a, int target) {

    return Ints.indexOf(a, target) >= 0;

}

⮚ Для массивов объектов

Guava’s Iterables класс содержит статический служебный метод indexOf(Iterator, Predicate) который возвращает индекс первого элемента, удовлетворяющего предоставленному предикату, или -1, если итератор не имеет таких элементов.

// Общий метод для проверки, содержит ли массив объектов определенное значение

public static<T> boolean find(T[] a, T target)

{

    int index = Iterators.indexOf(Iterators.forArray(a),

                            Predicates.in(Collections.singleton(target)));

    return index >= 0;

}

 
Для Java 8 и выше мы можем использовать лямбда-выражения:

// Общий метод для проверки, содержит ли массив объектов определенное значение

public static<T> boolean find(T[] a, T target) {

    return Iterators.indexOf(Iterators.forArray(a), x -> x.equals(target)) >= 0;

}

Это все, что касается определения того, содержит ли массив определенное значение в Java.

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