Как искать строку в массиве String

Общий

Предполагая, что все спускается с object (вы сами по себе, если это не так), Python вычисляет порядок разрешения метода (MRO) на основе вашего дерева наследования класса. MRO удовлетворяет 3 свойствам:

  • Дети класса приходят перед своими родителями
  • Левые родители приходят перед правильными родителями
  • Класс появляется только один раз в MRO

Если такой порядок не существует, ошибки Python. Внутренняя работа - это C3-линеризация родословных классов. Подробнее читайте здесь: https://www.python.org/download/releases/2.3/mro/

Таким образом, в обоих приведенных ниже примерах это:

  1. Ребенок
  2. Влево
  3. Вправо
  4. Родитель

Когда метод вызванное, первое вхождение этого метода в MRO - это тот, который вызывается. Любой класс, который не реализует этот метод, пропускается. Любой вызов super внутри этого метода вызовет следующее вхождение этого метода в MRO. Следовательно, это имеет значение как в том порядке, в котором вы размещаете классы в наследовании, так и там, где вы помещаете вызовы в super в методах.

С super сначала в каждом методе

class Parent(object):
    def __init__(self):
        super(Parent, self).__init__()
        print "parent"

class Left(Parent):
    def __init__(self):
        super(Left, self).__init__()
        print "left"

class Right(Parent):
    def __init__(self):
        super(Right, self).__init__()
        print "right"

class Child(Left, Right):
    def __init__(self):
        super(Child, self).__init__()
        print "child"

Child() Выходы:

parent
right
left
child

С super последним в каждом методе

class Parent(object):
    def __init__(self):
        print "parent"
        super(Parent, self).__init__()

class Left(Parent):
    def __init__(self):
        print "left"
        super(Left, self).__init__()

class Right(Parent):
    def __init__(self):
        print "right"
        super(Right, self).__init__()

class Child(Left, Right):
    def __init__(self):
        print "child"
        super(Child, self).__init__()

Child() Выходы:

child
left
right
parent
68
задан Mister Positive 9 April 2019 в 11:56
поделиться

10 ответов

Каждый метод, упомянутый ранее, делает цикличное выполнение или внутренне или внешне, таким образом, не действительно важно, как реализовать его. Здесь другой пример нахождения всех ссылок целевой строки

       string [] arr = {"One","Two","Three"};
       var target = "One";
       var results = Array.FindAll(arr, s => s.Equals(target));
63
ответ дан Tamir 9 April 2019 в 21:56
поделиться

Это должна быть строка []? List< String> дал бы Вам, в чем Вы нуждаетесь.

List<String> testing = new List<String>();
testing.Add("One");
testing.Add("Two");
testing.Add("Three");
testing.Add("Mouse");
bool inList = testing.Contains("Mouse");
25
ответ дан ZombieSheep 9 April 2019 в 21:56
поделиться

Если массив отсортирован, можно использовать BinarySearch. Это - O (зарегистрируйте n), операция, таким образом, это быстрее как цикличное выполнение. Если необходимо применить несколько поисков, и скорость является беспокойством, Вы могли бы отсортировать ее (или копия) перед использованием ее.

6
ответ дан GvS 9 April 2019 в 21:56
поделиться
  • 1
    3 миллиона строк со средними 80 символами на строку будут о 240M Байты, который огромен для загрузки файла в памяти. – Vikram.exe 7 January 2011 в 04:31
bool exists = arr.Contains("One");
11
ответ дан mohammedn 9 April 2019 в 21:56
поделиться

Почему запрет "Я не хочу использовать какое-либо цикличное выполнение"? Это - самое очевидное решение. При давании шанса быть очевидным возьмите его!

Примечание, которое звонит как arr.Contains(...), все еще идет в цикл , это просто не будете Вы, кто записал цикл.

Вы рассмотрели альтернативное представление, это более поддается поиску?

  • А хорошая реализация Набора работала бы хорошо. (HashSet, TreeSet или локальный эквивалент).
  • , Если можно быть уверены, что arr отсортирован, Вы могли использовать двоичный поиск (который должен будет рекурсивно вызвать или цикл, но не так часто как прямой линейный поиск).
4
ответ дан bendin 9 April 2019 в 21:56
поделиться
  • 1
    @S.Lott: Ну, зависит от файловой системы. Я использовал ext3. 30 000 объектов заняли 5,5 секунд. 100 000 объектов заняли 16,3 секунд. 200 000 объектов занимают 339 секунд. Я думаю, что поиск каталога становится медленным со многими объектами. 3 миллиона объектов возьмут часы . По крайней мере. База данных могла быть довольно быстрой, но я can' t быть побеспокоенным для тестирования.:-) Другая опция состояла бы в том, чтобы прочитать файл и сделать индекс на положении запуска каждого объекта и действительно ищет () s. Это должно быть быстрее, чем это. – Lennart Regebro 7 January 2011 в 08:25

Ну, что-то оказывается перед необходимостью смотреть, и цикличное выполнение более эффективно, чем рекурсия (так как рекурсия хвоста не полностью реализована)... поэтому, если Вы просто не хотите циклично выполнять себя, затем любой из:

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

или

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

Для получения информации: избегают имен как var - это - ключевое слово в C# 3.0.

115
ответ дан jcolebrand 9 April 2019 в 21:56
поделиться

В первом выстреле я мог придумать что-то вроде этого (но это - псевдо код и предположение, что Вы не можете использовать.NET встроенный libaries). Мог бы потребовать небольшого количества тонкой настройки и пересмотра прежнего мнения, но должен быть достаточно хорошим для преимущества, возможно?

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);
2
ответ дан Salman Kasbati 9 April 2019 в 21:56
поделиться
  • 1
    " Это будет очень slow"? медленнее да. Очень медленный спорно. Каждый отдельный шаг довольно быстр. – S.Lott 7 January 2011 в 07:05

Каждый класс, реализовывая IList имеет метод , Содержит (Объектное значение) . И Система - также. Массив.

4
ответ дан VolkerK 9 April 2019 в 21:56
поделиться
  • 1
    Интересные Данные. Я предполагаю I' ve тратил слишком долго использующие очень большие серверы. – S.Lott 7 January 2011 в 08:44

В C#, если можно использовать ArrayList, можно использовать, Содержит метод, который возвращает булевскую переменную:

if MyArrayList.Contains("One")
2
ответ дан DOK 9 April 2019 в 21:56
поделиться

Я считаю, что лучше использовать Array.Exists , чем Array.FindAll .

11
ответ дан 24 November 2019 в 13:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: