Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> C# ArrayList, Найти объект в ArrayList 
V
    Опции темы
14SatanA88
Дата 20.7.2011, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 13.5.2010

Репутация: нет
Всего: 5



Доброго времени суток, уважаемые программеры.

Есть структура
Код

        public struct Word
        {
            public string word; // слово
            public int kolvo; // количество повторений слова
            public string pages; // на каких страницах встречается слово
        }


И есть ArrayList
Код

ArrayList arr = new ArrayList();


Проходя по некоторому тексту, я читаю слово, записываю его в структуру.
Структуру сую в массив.

Вопрос такой: перед тем как добавить слово, нужно проверить, есть ли оно в массиве arr.
Если слова нет то создать новую структуру, записать ее в arr. А если есть, то вытянуть его структуру, отредактировать (то есть ++ количество, указать страницу, на которой слово найдено)

Заранее спасибо.

Это сообщение отредактировал(а) 14SatanA88 - 20.7.2011, 10:50
PM MAIL ICQ   Вверх
HalkaR
Дата 20.7.2011, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пуфыстый назгул
****


Профиль
Группа: Экс. модератор
Сообщений: 2132
Регистрация: 8.12.2002
Где: В Москве

Репутация: 5
Всего: 42



Если хотите оптимизировать процесс - используйте любую реализацию HashSet. Стандартная реализация появилась в .Net 3.0. Если у вас более ранняя версия можно воспользоваться сетом из Wintellect PowerCollections.
PM MAIL   Вверх
14SatanA88
Дата 20.7.2011, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 13.5.2010

Репутация: нет
Всего: 5



HalkaR, за совет спасибо.
но оптимизация не имеет смысла.
я понимаю, что способов реализации достаточно, но это просто лаба, и мне важны скорей сроки написания, нежели совершенство кода.

так что все сводится к вопросу
как найти структуру в ArrayList и поменять ее поля?
PM MAIL ICQ   Вверх
Суровый
Дата 20.7.2011, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 30.4.2009

Репутация: 1
Всего: 2



Цитата(14SatanA88 @  20.7.2011,  09:07 Найти цитируемый пост)
как найти структуру в ArrayList и поменять ее поля? 


Можно было бы найти структуру с помощью
Код

int index = arr.IndexOf(structObject);

если бы не дополнительные поля, которые невозможно отследить.

Поэтому, чтобы найти структуру по содержанию одного поля, следует использовать следующий код
Код

bool wasFounded = false; //переменная показывает, было ли найдено слово
foreach (Object o in arr)
{
    Word word = (Word)o;
    if (word.word == currentWord)  //currentWord - текущее слово
    {
        word.kolvo++;
        word.pages += " " + currentPage.ToString(); //currentPage - текущая страница
        wasFounded = true;
        break;
    }
}
if (!wasFounded)
{
    Word word;
    word.word = currentWord;
    word.kolvo = 1;
    word.pages = currentPage.ToString();
}


Это сообщение отредактировал(а) Суровый - 20.7.2011, 11:10
PM MAIL   Вверх
YurIOs
Дата 20.7.2011, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 28.6.2011
Где: Ukraine

Репутация: нет
Всего: 1



Я бы сделал так


Код

        Dictionary<string, Word> collection = new Dictionary<string, Word>(); // Вместо ArrayList Dictionary<string, Word>

        Word wrd;
        wrd.word = "someWord";
        wrd.kolvo = 3;
        wrd.pages = "1, 2, 2";


        //при добавлении логика следующая

        if (collection.ContainsKey(wrd.word))
            //если слово уже добавлено в колекцию
        {
            
            collection[wrd.word].kolvo++;
            collection[wrd.word].pages += pageNumberString;
        }
        else
            //иначе добавляем слово в колекцию
        {
            // ...
            collection.Add(wrd.word, wrd);
        }

PM ICQ   Вверх
Суровый
Дата 20.7.2011, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 30.4.2009

Репутация: 1
Всего: 2



YurIOs, 
Я бы тоже использовал нечто похожее (в данном случае использовал бы Hashtable)
Но т.к. задание просит использовать ArrayList, приходится отталкиваться от этого  smile 
PM MAIL   Вверх
Fortnox
Дата 20.7.2011, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 373
Регистрация: 31.10.2008
Где: Ростов-на-Дону

Репутация: 2
Всего: 22



Э, банальный цикл for?
Код

  for (int i = 0; i<arr.Count; ++i)
            {
                var word = (Word)arr[i];
                if (word.word == "Hello")
                    word.kolvo++;
             }

PM MAIL   Вверх
YurIOs
  Дата 20.7.2011, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 28.6.2011
Где: Ukraine

Репутация: нет
Всего: 1



2 Суровый

Ну уж если нужно использовать только ArrayList тогда ваш вариант решения в самый раз  smile 

А разве только Hashtable использует технику хеш таблиц, или и все динамические коллекции в фреймворке?
PM ICQ   Вверх
14SatanA88
Дата 20.7.2011, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 13.5.2010

Репутация: нет
Всего: 5



Цитата

задание просит использовать ArrayList


вроде бы) если не получится с ArrayList, то придется использовать что-либо другое.

щас через пару часов по работе прогу допишу, и попробую ваши предожения.
PM MAIL ICQ   Вверх
Суровый
Дата 20.7.2011, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 30.4.2009

Репутация: 1
Всего: 2



14SatanA88, 
В общем-то, если не получится или не захочешь использовать ArrayList, то рекомендую использовать Hashtable:

Код

System.Collections.Hashtable hashtable = new System.Collections.Hashtable();
//...
Word w;
w.word = currentWord;
w.pages = currentPage.ToString();
w.kolvo = 1;

if (hashtable.ContainsKey(w.word))
{
    Word word = (Word)hashtable[w.word];
    word.kolvo++;
    word.pages += " " + w.pages;
}
else
{
    hashtable.Add(w.word, w);
}


Добавлено через 5 минут и 45 секунд
YurIOs, 
я привык использовать Hashtable только потому, что в нем не нужно указывать тип добавляемых объектов smile 
А по вопросу: да, реализация хэш-таблиц выполнена только в Hashtable, неспроста он так называется  smile 
PM MAIL   Вверх
YurIOs
Дата 20.7.2011, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 28.6.2011
Где: Ukraine

Репутация: нет
Всего: 1



Цитата(Суровый @  20.7.2011,  11:31 Найти цитируемый пост)
В общем-то, если не получится или не захочешь использовать ArrayList....


Если использовать обобщения то не будет необходимости использовать приведение типов  smile 
Только что смотрел документацию на MSDN: обобщенная коллекция Dictionary(TKey, TValue) также использует технологию хеш-таблиц а значит также эффективна   smile 
PM ICQ   Вверх
14SatanA88
Дата 20.7.2011, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 13.5.2010

Репутация: нет
Всего: 5



Суровый, возьму на заметку. Тем более что у меня следующая лаба как раз по Hashtable.
PM MAIL ICQ   Вверх
14SatanA88
Дата 20.7.2011, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 13.5.2010

Репутация: нет
Всего: 5



Fortnox, хотел попробовать ваш вариант, потому что он самый короткий, но среда ругается на var.
У меня студия 2005. Может var еще не поддерживается в этой версии языка?
PM MAIL ICQ   Вверх
14SatanA88
Дата 20.7.2011, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 13.5.2010

Репутация: нет
Всего: 5



Суровый, ваш метод работает, но не совсем верно.
Повторений слов нет, но каждое слово с количеством 1 и единственной страницей, там где оно первый раз замечено

Добавлено @ 14:36
все, сделал. 
забыл изменения сохранить в найденном слове.

всем огромное спасибо.

вопрос закрыт.

Это сообщение отредактировал(а) 14SatanA88 - 21.7.2011, 08:22
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0893 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.