Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Vęłūm Vèřům
 Аватар для Zuria
31 / 35 / 1
Регистрация: 26.06.2024
Сообщений: 164

ParseStringToDictionary

28.07.2024, 23:46. Показов 673. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Беглый поиск по ветке свежего результата не выдал, поэтому уточню:

Пусть дано словарь D:=new Dictionary<string, integer>, где ключ всегда состоит из двух символов, а значение целое -1000 до 1000.

Как проще организовать функцию function ParseStringToDictionary(x:string):Dictionary<string, integer>, которая заполняет словарь из строки? А то с RegEx как-то сложно получается.
0
Лучшие ответы (1)
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
29.07.2024, 11:32
Нужно сначала знать формат строки которую парсят, чтобы что-то писать.
0
Vęłūm Vèřům
 Аватар для Zuria
31 / 35 / 1
Регистрация: 26.06.2024
Сообщений: 164
29.07.2024, 17:04  [ТС]
ключ всегда состоит из двух символов (кроме "-1234567890"),
а значение целое -1000 до 1000
Берём два символа под ключ и после в цикле ищем букву, добавляя в цифры. Повторяем до конца строки.

Знак минус сбивает с толку, а в отдельную переменную не хотелось бы.
0
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
29.07.2024, 18:29
По моему это огрызок задания. Вставляйте целиком, так как вам его дали вам. Иначе слишком много гадания.

Добавлено через 31 секунду
И примеры ввода в конце тоже не обрезайте...

Добавлено через 1 час 22 минуты
Я бы как то так делал:
Pascal
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
## {$zerobasedstrings}
 
function ParseStringToDictionary(s: string): Dictionary<string, integer>;
begin
  var num_syms := ('0'..'9').ToHashSet;
  num_syms += '-'; // Вынести бы наверх - если очень важна производительность.
  
  Result := new Dictionary<string, integer>;
  
  var i := 0;
  while i <> s.Length do
  begin
    var key := s.Substring(i, 2);
    i += key.Length;
    
    var c := 0;
    while s[i+c] in num_syms do
    begin
      c += 1;
      if i+c=s.Length then break;
    end;
    var val := s.Substring(i, c);
    i += c;
    
    Result.Add(key, StrToInt(val));
  end;
  
end;
 
Println(ParseStringToDictionary(ReadString));
1
Vęłūm Vèřům
 Аватар для Zuria
31 / 35 / 1
Регистрация: 26.06.2024
Сообщений: 164
29.07.2024, 19:35  [ТС]
Бывают разные варианты RegEx, пока такая заготовка
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var data := 'AB100CD-500 EF999GH-1000IJ1000 KL0';
var dic := new Dictionary<string, integer>;
 
//--------------------------------------------
var pattern := '([A-Za-z]{2})(-?\d{1,4})';
var _matches := Regex.Matches(data, pattern);
 
foreach var m in _matches do
begin
  var s:=m.ToString;
  var k := s?[:3];
  var v := 0;
  if integer.TryParse(s?[3:], v) then if (k.Length=2) and (v in -1000..1000) then dic[k] := v
end;
//--------------------------------------------
dic.PrintLines;
0
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
29.07.2024, 19:48
Лучший ответ Сообщение было отмечено Zuria как решение

Решение

Ну вот допустим про пробелы после числа в вашем объяснении задания ничего сказано не было. Поэтому моя программа с таким не сработает.

И про то что если ключ или значение неправильное то надо пропускать эту пару - тоже ничего не сказано.

Чего из вас вытягивать такие подробности надо - выкладывайте сразу всё...

---

По коду
- Регекс плохая идея, особенно если вы проверяете ключи и значения на валидность - потому что он будет тупо игнорить фрагменты, которые не получилось пропарсить
- Вы в регексе объявляете группы (в круглых скобках) - но потом их не используете
- В каком случае длина ключа будет не 2?
- Добавление в словарь по индексу перезаписывает предыдущее значение ключа - а .Add будет сообщать что что-то пошло не так

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
##
var data := 'AB100CD-500 EF999GH-1000IJ1000 KL0';
var dic := new Dictionary<string, integer>;
 
//--------------------------------------------
var pattern := '([A-Za-z]{2})(-?\d{1,4})';
var matches := data.Matches(pattern);
 
foreach var m: &Match in matches do
begin
  var k := m.Groups[1].Value;
  var v: integer;
  if not integer.TryParse(m.Groups[2].Value, v) then continue;
  if v not in -1000..+1000 then continue;
  dic.Add(k, v);
end;
//--------------------------------------------
dic.PrintLines;
1
Vęłūm Vèřům
 Аватар для Zuria
31 / 35 / 1
Регистрация: 26.06.2024
Сообщений: 164
29.07.2024, 19:57  [ТС]
Пробелы и символы вне диапазона для проверки остались, в условии не учитываются.

А так вы правы - была непонятка с регексами, начались эксперименты, а затем пришлось всё переделать.
Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru