Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 23.05.2017
Сообщений: 65

Поиск дубликатов строк

24.07.2018, 08:48. Показов 4684. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, никак не могу написать код для пробега по массиву и вывода всех уникальных строк по одному разу. В массиве около сотни строк, но почти все одинаковые (всего около 3-4 строк, которые постоянно повторяются). Пробовал так, но ничего не получается.
C++
1
2
3
4
5
6
7
8
    
    for (int i=2; i < StringGrid1->RowCount; i++) {
        for (int j=2; j < StringGrid1->RowCount; j++) {
            if(StringGrid1->Cells[2][i] != StringGrid2->Cells[7][j]) {
                StringGrid2->Cells[7][i] = StringGrid1->Cells[2][i];
            }
        }
    }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.07.2018, 08:48
Ответы с готовыми решениями:

Копирование строк-дубликатов из StringGrid1 в StringGrid2
Доброго дня суток! Помогите разобраться с задачей. Нужно загрузить из файла csv массив с данными, найти дубликаты и выписать их...

Поиск и удаление дубликатов и инвертированных значений
Доброго времени суток! У меня 2 вопроса: Имеются параметры(например работоспособность телефона в виде двоичного кода): 1 0 1 0 1...

База хешей и поиск среди них дубликатов
скиньте пожалуйста кто нибудь код для этой программы

24
Модератор
 Аватар для D1973
9924 / 6460 / 2457
Регистрация: 21.01.2014
Сообщений: 27,410
Записей в блоге: 3
24.07.2018, 09:09
Letzins, При чем тогда StringGrid? Покажите пример массива и как он у Вас в СтрингГрид размещается...
А вообще - IndexOf() в помощь
0
0 / 0 / 0
Регистрация: 23.05.2017
Сообщений: 65
24.07.2018, 09:34  [ТС]
D1973, У меня есть StringGrid заполненный строками. Я пытаюсь перенести в другой StringGrid уникальные строки по одному разу.
C++
1
2
3
if(StringGrid1->Cells[2][i] != StringGrid2->Cells[7][j]) {
                StringGrid2->Cells[7][i] = StringGrid1->Cells[2][i];
            }
Проверяю есть ли во втором SG текущее значение, если нет, то переношу строку. Но почему то выводит ахинею.
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
24.07.2018, 09:47
Letzins, помнится уважаемый volvo уже где-то давал рекомендации использования библиотек работы со строками, где присутствовала функция выборки уникальных строк. На вскидку у меня их найти не получилось, но если поднапрячься... .
0
Модератор
 Аватар для D1973
9924 / 6460 / 2457
Регистрация: 21.01.2014
Сообщений: 27,410
Записей в блоге: 3
24.07.2018, 09:52
Это надо?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <memory>
...
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
//Создаем СтрингЛист
  std::auto_ptr<TStringList> L (new TStringList);
//Копируем в него уникальный строки из StringGrid1
  for(int i = StringGrid1->FixedRows; i < StringGrid1->RowCount; i++)
   if(L->IndexOf(StringGrid1->Rows[i]->CommaText) == -1)
    L->Add(StringGrid1->Rows[i]->CommaText);
//Очищаем СтрингГрид2
  for(int i = StringGrid2->FixedRows; i < StringGrid2->RowCount; i++)
   StringGrid2->Rows[i]->Clear();
//Устанавливаем кол-во строк в СтрингГрид2
  StringGrid2->RowCount = L->Count + StringGrid2->FixedRows;
//Заполняем СтрингГрид2
  for(int i = 0; i < L->Count; i++)
   StringGrid2->Rows[i + StringGrid2->FixedRows]->CommaText = L->Strings[i];
}
2
0 / 0 / 0
Регистрация: 23.05.2017
Сообщений: 65
24.07.2018, 10:36  [ТС]
Да! Спасибо большое!

Добавлено через 18 минут
D1973, Кажется, все-таки не работает Не могу понять.. он по какому принципу сортирует?
0
Модератор
 Аватар для D1973
9924 / 6460 / 2457
Регистрация: 21.01.2014
Сообщений: 27,410
Записей в блоге: 3
24.07.2018, 10:38
Цитата Сообщение от Letzins Посмотреть сообщение
все-таки не работает
А у меня почему-то работает: из первой таблицы выбирает только уникальные строки и копирует их во вторую...


Цитата Сообщение от Letzins Посмотреть сообщение
он по какому принципу сортирует
Здрас-сте, приехали... А сортировка-то тут с какого боку затесалась?
0
0 / 0 / 0
Регистрация: 23.05.2017
Сообщений: 65
24.07.2018, 11:03  [ТС]
D1973, сорян, ступил на счет сортировки
А как сделать, чтобы он не подряд все тащил, а только уникальные строки в пределах одного столбца?, т.е. конкретные ячейки
0
Модератор
 Аватар для D1973
9924 / 6460 / 2457
Регистрация: 21.01.2014
Сообщений: 27,410
Записей в блоге: 3
24.07.2018, 11:27
Letzins, я Вас во 2-м посте спрашивал: покажите пример. Сейчас я повторяю вопрос: покажите, что есть и что должно в итоге получиться...
0
0 / 0 / 0
Регистрация: 23.05.2017
Сообщений: 65
24.07.2018, 13:00  [ТС]
D1973, Есть такой столбец:
Строка 1
Строка 2
Строка 3
Строка 1
Строка 1
Строка 4
Строка 2
Строка 3
Строка 2
Нужен такой:
Строка 1
Строка 2
Строка 3
Строка 4
0
Модератор
 Аватар для D1973
9924 / 6460 / 2457
Регистрация: 21.01.2014
Сообщений: 27,410
Записей в блоге: 3
24.07.2018, 14:07
Лучший ответ Сообщение было отмечено Letzins как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
  for(int i = StringGrid2->FixedRows; i < StringGrid2->RowCount; i++)
   StringGrid2->Rows[i]->Clear();
  int k = StringGrid2->FixedRows;
  StringGrid2->RowCount = k + 1;
  for(int i = StringGrid1->FixedRows; i < StringGrid1->RowCount; i++)
   if(StringGrid2->Cols[2]->IndexOf(StringGrid1->Cells[2][i]) == -1)
    {
      StringGrid2->Cells[2][k++] = StringGrid1->Cells[2][i];
      StringGrid2->RowCount++;
    }
  StringGrid2->RowCount--;
}
Миниатюры
Поиск дубликатов строк  
1
0 / 0 / 0
Регистрация: 23.05.2017
Сообщений: 65
24.07.2018, 14:25  [ТС]
D1973, огромное спасибо за помощь!!!
Работает как надо
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33399 / 21509 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
24.07.2018, 16:38
Лучший ответ Сообщение было отмечено Letzins как решение

Решение

Циклы? Зачем? TStringList уже имеет все необходимое, чтобы сделать то, что надо безо всяких циклов, надо ему просто подсказать:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class TMyStringList : public Classes::TStringList
{
public:
    virtual int __fastcall AddObject(const String S, TObject* AObject)
    {
        int Result;
        if ((Result = IndexOf(S)) == -1) Result = TStringList::AddObject(S, 0);
        return Result;
    }
};
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    std::auto_ptr<TMyStringList>list(new TMyStringList); // #include <memory>, чтобы не было ошибки
    list->AddStrings(StringGrid1->Cols[2]); // сохраняем из нужного столбца первого грида данные в list, при этом все дубликаты волшебным образом отсекутся
 
    StringGrid2->RowCount = list->Count;
    StringGrid2->Cols[2]->CommaText = list->CommaText; // а теперь просто копируем из list-а все, что там осталось во второй грид, при этом не забывая изменить число строк
}
3
0 / 0 / 0
Регистрация: 23.05.2017
Сообщений: 65
24.07.2018, 17:04  [ТС]
volvo, Тоже работает Спасибо!
А вот еще вопрос, можно как нибудь сохранить положение?
Строка 1
Строка 2
Строка 1
Строка 3
Строка 1
Строка 4
Строка 2
Строка 3
Строка 2
Чтобы получилось так:
Строка 1
Строка 2
-
Строка 3
-
Строка 4
-
-
-

Добавлено через 10 минут
Просто задача следующая: Есть элементы (описаны построчно - 1 строка: 1 элемент -- модель -- количество). В таблице они расположены по алфавиту (отсортированы по индексу С, К, R и далее). Нужно изменять большинство строк и выводить в Word. Но если потеряется связь между элементом и моделью (это именно тот столбец, для которого был нужен этот топик), придется высчитывать отдельно количество элементов, сопоставлять их моделям и т.д. В общем это сильно тормознет программу. А если сохранится порядок, будет удобнее делать вывод обычным циклом, который в i-ой строке возьмет и элемент, и модель, и количество.

Надеюсь вы поняли меня Ибо мозг уже не работает!
0
Модератор
 Аватар для D1973
9924 / 6460 / 2457
Регистрация: 21.01.2014
Сообщений: 27,410
Записей в блоге: 3
24.07.2018, 18:09
Лучший ответ Сообщение было отмечено Letzins как решение

Решение

Цитата Сообщение от Letzins Посмотреть сообщение
Надеюсь вы поняли меня
Честно сказать - не совсем... Решение частного вопроса - вот оно, но сдается мне, тут классический случай XYZ



модифицированный пример от volvo...
C++
1
2
3
4
5
6
7
virtual int __fastcall AddObject(const String S, TObject* AObject)
    {
        int Result;
        if ((Result = IndexOf(S)) == -1) Result = TStringList::AddObject(S, 0);
        else Result = TStringList::AddObject("-", 0);
        return Result;
    }
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33399 / 21509 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
24.07.2018, 18:19
Я бы даже сказал, так:
C++
1
2
3
4
    virtual int __fastcall AddObject(const String S, TObject* AObject)
    {
        return TStringList::AddObject(IndexOf(S) == -1 ? S : String("-"), 0);
    }
3
0 / 0 / 0
Регистрация: 23.05.2017
Сообщений: 65
25.07.2018, 08:09  [ТС]
D1973, volvo, Оба способа отлично работают! Спасибо!
volvo, Вы любую задачу можете сократить до одной строчки?
0
0 / 0 / 0
Регистрация: 23.05.2017
Сообщений: 65
27.07.2018, 10:24  [ТС]
volvo, D1973, А можно например, получить следующий столбец:
Допустим есть два столбца с данными:
А Строка 1
А Строка 2
А Строка 1
B Строка 3
B Строка 3
B Строка 4
B Строка 5
C Строка 6
C Строка 6
А нужен следующий столбец:
А Строка 1
А Строка 2
А
B Строка 3
B Строка 4
B Строка 5
B
C Строка 6
C
Знаю, что уже надоел) Буду признателен за помощь!
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33399 / 21509 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
27.07.2018, 11:03
Вообще-то мой код так и работает (по крайней мере, для вышеприведенного теста, если между разными буквами первого столбца НЕ встречаются одинаковые строки во втором столбце - он выдает нужное:
Миниатюры
Поиск дубликатов строк  
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33399 / 21509 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
27.07.2018, 11:06
А, тебе надо, чтобы пустые были внизу в каждой группе? Тогда чуть-чуть меняется код. Сейчас...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.07.2018, 11:06
Помогаю со студенческими работами здесь

Быстрый поиск дубликатов строк
Есть большой файл (3,5 миллиона записей). Нужно быстро найти все дубликаты строк и вывести индексы/как-то их сохранить. Прямой поиск...

Поиск дубликатов строк по нескольким столбцам
Добрый день уважаемые форумчане! Имеется excel файл с двумя листами X и Y. Лист Y содержит 13 столбов (в скором времени их станет...

Поиск одинаковых строк в файле с удалением дубликатов
Помогите или подскажите. В текстовом файле в разном порядке есть одинаковые строки. Необходимо найти все одинаковые, удалить все...

Поиск одинаковых строк в текстовом файле и вывод дубликатов в другой текстовый файл
Добрый вечер. Нужна помощь знатоков Есть текстовый файл по пути D:\arxiv\rezult.txt с содержимым: Air robot MPEG-4-5min...

Удаление дубликатов строк
Доброго всем времени суток! Есть таблица, в которой присутствуют дубликаты строк; пОля, вроде id, в таблице нет; добавлять новые поля...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
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
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
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
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru