[C#] Ошибка

  • Автор темы Автор темы surrealmix
  • Дата начала Дата начала

surrealmix

Client
Регистрация
07.03.2013
Сообщения
715
Реакции
409
Баллы
63
Переменная текст содержит значение "Alfa Romerio" специально.
Смысл программы:
Даём на вход слово, и прога ищет его в списке.
Если не находит - обрезается последняя буква слова и опять происходит поиск. И так до тех пор пока не найдёт совпадение.

Результат http://clip2net.com/s/5BfClV

В чем моя ошибка? Пару часов ломал голову ссылаясь на свою невнимательность, но так и не понял где я ошибся.
 
Переменная текст содержит значение "Alfa Romerio" специально.
Смысл программы:
Даём на вход слово, и прога ищет его в списке.
Если не находит - обрезается последняя буква слова и опять происходит поиск. И так до тех пор пока не найдёт совпадение.

Результат http://clip2net.com/s/5BfClV

В чем моя ошибка? Пару часов ломал голову ссылаясь на свою невнимательность, но так и не понял где я ошибся.

Код:
Развернуть Свернуть Копировать
           string txt = "alfa romeoAA";

            List<string> list = new List<string>();
            list.Add("ac");
            list.Add("bmw");
            list.Add("alfa romeo");
            list.Add("acura");
            while (txt.Length > 1 && !list.Contains(txt))
            {
                txt = txt.Substring(0, txt.Length - 1);
            }
            return list.IndexOf(txt);


так работает
 
но коряво, так будет правильнее
Код:
Развернуть Свернуть Копировать
string txt = "alfa romeoAA";

            List<string> list = new List<string>();
            list.Add("ac");
            list.Add("bmw");
            list.Add("alfa romeo");
            list.Add("acura");
            int i = 0;
            for (i = 0; i < list.Count;i++ )
                if(txt.IndexOf(list[i])==0)
                    break;
            if (i == list.Count)
                return -1;
            else
              return i;
 
  • Оценить
Реакции: surrealmix
Переменная текст содержит значение "Alfa Romerio" специально.
Смысл программы:
Даём на вход слово, и прога ищет его в списке.
Если не находит - обрезается последняя буква слова и опять происходит поиск. И так до тех пор пока не найдёт совпадение.

Результат http://clip2net.com/s/5BfClV

В чем моя ошибка? Пару часов ломал голову ссылаясь на свою невнимательность, но так и не понял где я ошибся.
surrealmix, Ты написал что должно быть "2". Но код тебе всё правильно с сделал. Так как метод List<T>.Containts(T) ищет точное совпадение. Если честно я вообще не понял что делает этот код. Может тебе просто описать что нужно, точно есть хороший способ это выполнить
 
Есть список в проекте ЗенноПостера.
Есть переменная mark, содержащая марку машины (в данном случае переменная содержит "Alfa Romerino").
Необходимо написать код, который будет искать в списке марку, находящуюся в переменной.
Если марка не найдена в списке, то обрезается последний символ в переменной mark и снова идёт поиск.
И так до конца пока не найдём более подходящюю строку. В данном случае программа должна найти в списке "Alfa Romeo".
Если строка найдена - взвращаем индекс строки в списке.

Смысл кода - искать точное совпадение, и если точного совпадения нет, то тогда искать более похожее.

AC
Acura
Alfa Romeo
Alpina
Aro
Asia
Aston Martin
Audi
BAW
Bentley
BMW
Brilliance
Bufori
Bugatti
Buick
BYD
Cadillac
Caterham
ChangFeng
Chery
Chevrolet
Chrysler
Citroen
Dacia
Dadi
Daewoo
Daihatsu
Daimler
Derways
Dodge
Dong Feng
Doninvest
Eagle
Ecomotors
FAW
 
JavaScript:
Развернуть Свернуть Копировать
var list = new List<string>();
list.AddRange(new [] { "AC", "Acura", "Alfa Romeo", "Alpina", "Aro", "Asia", "Aston Martin",
             "Audi", "BAW", "Bentley", "BMW", "Brilliance", "Bufori", "Bugatti", "Buick", "BYD", "Cadillac", "Caterham", 
             "ChangFeng", "Chery", "Chevrolet", "Chrysler", "Citroen", "Dacia", "Dadi", "Daewoo", "Daihatsu", "Daimler",
             "Derways", "Dodge", "Dong Feng", "Doninvest", "Eagle", "Ecomotors", "FAW"});


int i = -1;
while (i != text.Length)
{
    i++;
    foreach (string item in list)
        if (item.Contains(text.Substring(0, text.Length - i)))
            return list.IndexOf(item);
}

return "not found";
 
Последнее редактирование модератором:
  • Оценить
Реакции: surrealmix
Спасибо, чуть позже проверю.
 
int i = -1;
while (i != text.Length)
{
i++;
foreach (string item in list)
if (item.ToLower().Contains(text.Substring(0, text.Length - i).ToLower()))
return list.IndexOf(item);
}

return "not found";
 
  • Оценить
Реакции: surrealmix и shade
int i = -1;
while (i != text.Length)
{
i++;
foreach (string item in list)
if (item.ToLower().Contains(text.Substring(0, text.Length - i).ToLower()))
return list.IndexOf(item);
}

return "not found";


не оптимально, list.contains проходит по всему списку если техт="alfo romeo"+ 1000 букв ,то этот код пройдёт по списку 1000 раз,
этот код
Код:
Развернуть Свернуть Копировать
string txt = "alfa romeoAA";

            List<string> list = new List<string>();
            list.Add("ac");
            list.Add("bmw");
            list.Add("alfa romeo");
            list.Add("acura");
            int i = 0;
            for (i = 0; i < list.Count;i++ )
                if(txt.IndexOf(list[i])==0)
                    break;
            if (i == list.Count)
                return -1;
            else
              return i;
[/QUOTE]


проходит по списку один раз и делает то же самое.
 
не оптимально, list.contains проходит по всему списку если техт="alfo romeo"+ 1000 букв ,то этот код пройдёт по списку 1000 раз,
этот код
Код:
Развернуть Свернуть Копировать
string txt = "alfa romeoAA";

            List<string> list = new List<string>();
            list.Add("ac");
            list.Add("bmw");
            list.Add("alfa romeo");
            list.Add("acura");
            int i = 0;
            for (i = 0; i < list.Count;i++ )
                if(txt.IndexOf(list[i])==0)
                    break;
            if (i == list.Count)
                return -1;
            else
              return i;


проходит по списку один раз и делает то же самое.[/QUOTE]
Вообще то и в твоем коде будет тоже самое :):
1. У меня цикл foreach, а у тебя цикл for, который для получения элемента по индексу использует цикл foreach. T.e. цикл for для list.Count примерно равен (list.Count / 2)*foreach
2. txt.IndexOf - так же в себе содержит цикл по длине текста количество операций == txt.Length - list.Length.
Даже если взять только 2 пункт, что в твоём коде ((txt.Length + list.Length)*list.Count) что в моем (list.Count*(txt.Length + list.Length)) всё одинаково. Для справки методы String.IndexOf() и String.Contains() реализованы одинаково просто возвращают разные вещи. Трудоёмкость у них одинаковая O(m + n) - человечесво лучше способа не придумало :).

Причём если txt.Length > list.Length то в твоем коде операция (использование IndexOf) будет выполнятся, а вот в моём (Contains) не будет, т.к. длина шаблона поиска больше длины текста (сразу вернёт false).

P.S. никого пытаюсь задеть просто вношу ясность.
 
  • Оценить
Реакции: surrealmix
И вообще, это так принципиально?
 
Главное что работает и отрабатывает правильно. Спасибо за помощь!
 
Вообще то и в твоем коде будет тоже самое :):
1. У меня цикл foreach, а у тебя цикл for, который для получения элемента по индексу использует цикл foreach. T.e. цикл for для list.Count примерно равен (list.Count / 2)*foreach
2. txt.IndexOf - так же в себе содержит цикл по длине текста количество операций == txt.Length - list.Length.
Даже если взять только 2 пункт, что в твоём коде ((txt.Length + list.Length)*list.Count) что в моем (list.Count*(txt.Length + list.Length)) всё одинаково. Для справки методы String.IndexOf() и String.Contains() реализованы одинаково просто возвращают разные вещи. Трудоёмкость у них одинаковая O(m + n) - человечесво лучше способа не придумало :).

Причём если txt.Length > list.Length то в твоем коде операция (использование IndexOf) будет выполнятся, а вот в моём (Contains) не будет, т.к. длина шаблона поиска больше длины текста (сразу вернёт false).

P.S. никого пытаюсь задеть просто вношу ясность.


пункт 2 похоже ты прав, пункт 1 не знаю надо почитать дополнительно.

как на счет так?

Код:
Развернуть Свернуть Копировать
           string txt = "alfa romeoAA";

            List<string> list = new List<string>();
            list.Add("ac");
            list.Add("bmw");
            list.Add("alfa romeo");
            list.Add("acura");
            int i = 0;
            foreach (string car in list)
            {
                if (txt.Substring(0, car.Length) == car)
                    return i;
                i++;
            }
            return -1;

list.Count*list.length
 
пункт 2 похоже ты прав, пункт 1 не знаю надо почитать дополнительно.

как на счет так?

Код:
Развернуть Свернуть Копировать
           string txt = "alfa romeoAA";

            List<string> list = new List<string>();
            list.Add("ac");
            list.Add("bmw");
            list.Add("alfa romeo");
            list.Add("acura");
            int i = 0;
            foreach (string car in list)
            {
                if (txt.Substring(0, car.Length) == car)
                    return i;
                i++;
            }
            return -1;

list.Count*list.length

Ну да, наверное это будет побыстрей чем оба других. Но это не всегда будет решать задачу (если я её правильно понял) которую поставил surrealmix.
Есть просто эквивалентный код который ещё быстрее
JavaScript:
Развернуть Свернуть Копировать
string txt = "alfa romeoAA";

List<string> list = new List<string>();
list.Add("ac");
list.Add("bmw");
list.Add("alfa romeo");
list.Add("acura");
int i = 0;
foreach (string car in list)
{
     if (txt.StartWith(car)) return i;
     i++;
}
return -1;
 
Анализатор CMS

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

Программма должна быть поддерживаемой (чтобы можно было с лёгкостью в неё добавить новые движки и их признаки без особых знаний)
Например, у нас есть какое-то количество признаков (кусков кода) - DLE(dle_root|dle-speedbar|dle-content).
Их может быть от одного до n-го количества.

Программа берет признак и ищет его в сорс-коде страницы.
Если находит, то берет второй признак и ищет его. Ищет третий признак (тут смысл в том чтобы наиболее точно орпеделить на каком движке стоит сайт, поэтому желательно искать нескольк признаков одной CMS.)
Если не находит больше 2-х признаков, то ничего страшного.
return engine; (в данном случае результат будет "DLE")


Код:
Развернуть Свернуть Копировать
string golink = project.Variables["golink"].Value;
string engine;

//переходим по ссылке
Tab tab = instance.ActiveTab;
    tab.Navigate(golink);

//Получаем исходный код страницы
string source = instance.ActiveTab.GetSourceText("utf-8");

//Ищем в source коде страницы признаки CMS
.........................а дальше не знаю )))
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)