[C#] Ошибка

surrealmix

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

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

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

limpopo

Client
Регистрация
06.07.2011
Сообщения
42
Благодарностей
2
Баллы
0
Переменная текст содержит значение "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);

так работает
 

limpopo

Client
Регистрация
06.07.2011
Сообщения
42
Благодарностей
2
Баллы
0
но коряво, так будет правильнее
Код:
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

shade

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

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

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

surrealmix

Client
Регистрация
07.03.2013
Сообщения
715
Благодарностей
409
Баллы
63
Есть список в проекте ЗенноПостера.
Есть переменная 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
 

shade

Client
Регистрация
19.11.2010
Сообщения
580
Благодарностей
346
Баллы
63
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

surrealmix

Client
Регистрация
07.03.2013
Сообщения
715
Благодарностей
409
Баллы
63
Спасибо, чуть позже проверю.
 

surrealmix

Client
Регистрация
07.03.2013
Сообщения
715
Благодарностей
409
Баллы
63

Hungry Bulldozer

Moderator
Регистрация
12.01.2011
Сообщения
3 441
Благодарностей
831
Баллы
113
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

surrealmix

Client
Регистрация
07.03.2013
Сообщения
715
Благодарностей
409
Баллы
63

limpopo

Client
Регистрация
06.07.2011
Сообщения
42
Благодарностей
2
Баллы
0
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]


проходит по списку один раз и делает то же самое.
 

shade

Client
Регистрация
19.11.2010
Сообщения
580
Благодарностей
346
Баллы
63
не оптимально, 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

shade

Client
Регистрация
19.11.2010
Сообщения
580
Благодарностей
346
Баллы
63
И вообще, это так принципиально?
 

surrealmix

Client
Регистрация
07.03.2013
Сообщения
715
Благодарностей
409
Баллы
63
Главное что работает и отрабатывает правильно. Спасибо за помощь!
 

limpopo

Client
Регистрация
06.07.2011
Сообщения
42
Благодарностей
2
Баллы
0
Вообще то и в твоем коде будет тоже самое :-):
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
 

limpopo

Client
Регистрация
06.07.2011
Сообщения
42
Благодарностей
2
Баллы
0

shade

Client
Регистрация
19.11.2010
Сообщения
580
Благодарностей
346
Баллы
63
пункт 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;
 

surrealmix

Client
Регистрация
07.03.2013
Сообщения
715
Благодарностей
409
Баллы
63
Анализатор 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)