Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 27.06.2017
Сообщений: 11

Модульный тест для хэш-таблицы падает с ArgumentOutOfRangeException

03.04.2018, 14:20. Показов 2062. Ответов 5

Студворк — интернет-сервис помощи студентам
В общем, написал хэш таблицу на C# и столкнулся с тем, что не могу никак провести этот тест. Подскажите, пожалуйста, что я делаю не так.

Код программы:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
 
namespace HashTable
{
    public class HashTable
    {
        public static void Main() { } 
           
        class KeyValuePair
        {
            public object Key { get; set; }
            public object Value { get; set; }
        }
 
        List<List<KeyValuePair>> list;
        /// <summary> 
        /// Конструктор контейнера 
        /// summary> 
        /// size">Размер хэ-таблицы 
        public HashTable(int s)
        {
            list = new List<List<KeyValuePair>>();
            for (int i = 0; i < s; i++)
            {
                list.Add(new List<KeyValuePair>());
            }
        }
        /// 
        /// Метод складывающий пару ключь-значение в таблицу 
        /// 
 
        public void PutPair(object key, object val)
        {
            var bucketNo = GetBucketNumber(key);
            foreach (var p in list[bucketNo])
            {
                if (Equals(p.Key, key))
                {
                    p.Value = val;
                    return;
                }
            }
 
            list[bucketNo].Add(new KeyValuePair { Key = key, Value = val });
        }
        /// <summary> 
        /// Поиск значения по ключу 
        /// summary> 
        /// key">Ключь 
        ///Значение, null если ключ отсутствует
        public object GetValueByKey(object key)
        {
            var BucketNo = GetBucketNumber(key);
            foreach (var p in list[BucketNo])
            {
                if (Equals(p.Key, key))
                {
                    return p.Value;
                }
            }
 
            return null;
        }
 
        private int GetBucketNumber(object key)
        {
            return Math.Abs(key.GetHashCode()) & list.Count;
        }
    }
}




Код тестов:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using HashTable;
using System.Collections.Generic;
namespace HashTableTests
{
    [TestClass]
    public class HashTableTests
    {
        [TestMethod]
        public void ElementsTest()
        {
            var t = new HashTable.HashTable(3);
 
            t.PutPair("dd", 231);
            t.PutPair("dfg", 3224);
            t.PutPair("aaas", 4422);
 
            Assert.AreEqual(t.GetValueByKey("dd"), 231);
            Assert.AreEqual(t.GetValueByKey("dfg"), 3224);
            Assert.AreEqual(t.GetValueByKey("aaas"), 4422);
        }
 
        [TestMethod]
        public void TwoEquialsElementsTest()
        {
            var h = new HashTable.HashTable(3);
 
            h.PutPair("a", 3232);
            h.PutPair("a", 342);
 
            Assert.AreEqual(h.GetValueByKey("a"), 342);
        }
 
        [TestMethod]
        public void ElementsTest2()
        {
            var h = new HashTable.HashTable(10000);
 
            for (int i = 1; i < 10000; i++)
            {
                h.PutPair(i, i+1);
            }
 
            Assert.AreEqual(h.GetValueByKey(15), 16);
        }
 
        [TestMethod]
        public void ElementsSearchTests()
        {
            var h = new HashTable.HashTable(10000);
 
            for (int i = 1; i < 10000; i++)
            {
                h.PutPair(i, i+1);
            }
 
            for (int i = 10000; i < 11000; i++)
            {
                Assert.AreEqual(h.GetValueByKey(i), null);
            }
        }
    }
}



Тесты, которые нужно было провести:
Добавление трёх элементов, поиск трёх элементов (сделал)

Добавление одного и того же ключа дважды с разными значениями сохраняет последнее добавленное значение(сделал)

Добавление 10000 элементов в структуру и поиск одного из них(сделал)

Добавление 10000 элементов в структуру и поиск 1000 недобавленных ключей, поиск которых должен вернуть null ( вот тут вопрос)
Меня интересует именно 4 тест. Ошибку выдает такую
Метод проверки HashTableTests.HashTableTests.ElementsSe archTests выдал исключение:
System.ArgumentOutOfRangeException: Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции.
Имя параметра: index.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.04.2018, 14:20
Ответы с готовыми решениями:

Модульный тест для класса
Имеется класс сокращающий дробь using System; using System.Collections.Generic; using System.Linq; using System.Text; using...

Сделать модульный тест по приведённому коду
имеется код,нужно сделать по нему модульные тесты .Пробовала с помощью автоматической генерации тестов visual studio....какая-то ерунда...

Создать модульный тест чтобы он проверял открытие файла
Добрый день форумчане дали задание на создание модульного теста поставили условие чтобы он проверял открытие файла понятие не имею как...

5
 Аватар для Sanya_sa
912 / 816 / 333
Регистрация: 03.02.2015
Сообщений: 5,276
Записей в блоге: 9
03.04.2018, 14:43
demamoos, ответ написан Вами же
Цитата Сообщение от demamoos Посмотреть сообщение
Индекс за пределами диапазона
.
Смотрите где выскочили.
0
0 / 0 / 0
Регистрация: 27.06.2017
Сообщений: 11
03.04.2018, 14:59  [ТС]
Суть в том, что я и не понимаю, где вышел за границы. Мне ведь нужно заполнить сначала структуру 10000 элементами, а потом найти 1000 недобавленных ключей, т.е. тех, чье значение равно null. По сути нужно просто посчитать новую 1000 элементов поверх той десятки к, поэтому и я взял диапазон от 10000 до 11000.
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
03.04.2018, 15:34
Лучший ответ Сообщение было отмечено demamoos как решение

Решение

Проверяйте, что возвращает ваш GetBucketNumber, когда вы передаете ему индекс, выходящий за диапазон 10000.
Скорее всего, там и падает когда вы пытаетесь обратиться ко внешнему списку по индексу, превосходящему длину коллекции.
Не надо гадать, просто воспользуйтесь отладчиком.
0
0 / 0 / 0
Регистрация: 27.06.2017
Сообщений: 11
03.04.2018, 16:17  [ТС]
При запуске отладки не выдает ошибок, ошибки только в тестах.
0
0 / 0 / 0
Регистрация: 27.06.2017
Сообщений: 11
03.04.2018, 16:20  [ТС]
А все понял, запустил, вот, что выдало
Миниатюры
Модульный тест для хэш-таблицы падает с ArgumentOutOfRangeException  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.04.2018, 16:20
Помогаю со студенческими работами здесь

Создать модульный тест, который проверяет действительно ли экранируются все строки
Есть метод, который экранирует строки, если там встречается &quot;;&quot; public static Stream Write(string columnNames, IEnumerable&lt;string&gt;...

Как написать модульный тест для функции main
имеется функция нахождения максимального из трех целых чисел int main() { int a, b, c, mx; printf (&quot;Insert...

Нужно написать модульный тест для приложения Windows Form
Вот код приложения: namespace ARPS { public partial class Form1 : Form { public Form1() { ...

Тест (Тест->Создать тест.->Модульный тест.)
есть нечто подобное в билдере ? или вообще программа создающая тесты и на VS и на билдер и пр.? и с чего начать чтоб разобраться с этими...

Модульный тест
Привет. Почему функция bin_search не проходит тест? тестировал отдельно - результаты вроде верные а когда запускаю UnitTest то...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru