1 / 1 / 0
Регистрация: 23.01.2022
Сообщений: 36
1

Одновременная сортировка по имени файла и группировка по расширению

26.07.2022, 19:03. Показов 1558. Ответов 23

Здравствуйте, гении форума!

Нужна ваша помощь, у меня есть файл в котором хранится адреса на другие файлы, мне нужно эти адреса отсортировать по имени файла по алфавиту и сгруппировать по расширению файла. По отдельности это сделать легко но все вместе у меня не выходит - надеюсь на вашу помощь.

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
#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
#include "Header.h"
using namespace std;
 
bool pred(string a, string b) {
    if (a.substr(a.rfind(".") + 1, a.size()) == b.substr(b.rfind(".") + 1, b.size()) &&
        a.substr(a.rfind("\\") + 1, a.size()) < b.substr(b.rfind("\\") + 1, b.size())) return true;
    else return false;
}
 
int StrOutput(string name) {
    ifstream stri(name);
    string line, arr[99];
    int k = 0;
    while (!stri.eof() && stri >> line) {
        arr[k++] = line.erase(0, line.find("\\"));
    }
    sort(arr, arr + k, pred);
    stri.close();
 
    ofstream stro(name.insert(name.find("."), "str"));
    for (int i = 0; i < k; i++) {
        stro << arr[i] << endl;
    }
    stro.close();
    return 0;
}
Файл с адресами для сортировки и группировки:
D:\Documents\OP\list\list1\tex t.txt
D:\Documents\OP\list\list2\doc ument.docx
D:\Documents\OP\list\list3\pro gram.cpp
D:\Documents\OP\list\list2\2te xt.txt
D:\Documents\OP\list\list1\2do cument.docx
D:\Documents\OP\list\list3\2pr ogram.cpp

Что получается:
\Documents\OP\list\list2\2text .txt
\Documents\OP\list\list1\text. txt
\Documents\OP\list\list2\docum ent.docx
\Documents\OP\list\list3\progr am.cpp
\Documents\OP\list\list1\2docu ment.docx
\Documents\OP\list\list3\2prog ram.cpp

Что должно быть:
\Documents\OP\list\list1\2docu ment.docx
\Documents\OP\list\list2\docum ent.docx
\Documents\OP\list\list3\2prog ram.cpp
\Documents\OP\list\list3\progr am.cpp
\Documents\OP\list\list2\2text .txt
\Documents\OP\list\list1\text. txt
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.07.2022, 19:03
Ответы с готовыми решениями:

Отображение bitmap слева от имени файла по его расширению
Господа! Как по расширению файла отобразить его icon? Интересует механизм с API. Спасибо.

Media Player Не удается определить тип устройства по указанному расширению имени файла
Прошу помогите мне с Media Player. Суть такова: Я хочу при запуске программы Media Player...

Media Player Не удается определить тип устройства по указанному расширению имени файла
помогите разобратся делфи ругается Media Player Не удается определить тип устройства по указанному...

Ошибка "не удалось определить тип устройства по указанному расширению имени файла"
При запуске проекта выдает &quot;не удалось определить тип устройства по указанному расширению имени...

23
5233 / 2887 / 1208
Регистрация: 07.02.2019
Сообщений: 7,284
26.07.2022, 19:18 2
Цитата Сообщение от delazario Посмотреть сообщение
Что должно быть:
Так и где тут сортировка по "адресам", если порядок у вас:
...list1...
...list2...
...list3...
...list3...
...list2...
...list1...
?
0
1 / 1 / 0
Регистрация: 23.01.2022
Сообщений: 36
26.07.2022, 19:20  [ТС] 3
Цитата Сообщение от delazario Посмотреть сообщение
отсортировать по имени файла по алфавиту
Сортировка не по адресам а по именам файлов.
0
5233 / 2887 / 1208
Регистрация: 07.02.2019
Сообщений: 7,284
26.07.2022, 19:21 4
Цитата Сообщение от delazario Посмотреть сообщение
мне нужно эти адреса отсортировать по имени файла по алфавиту и сгруппировать по расширению файла.
Сначала группируете по расширению, а затем каждую группу сортируете.
1
1 / 1 / 0
Регистрация: 23.01.2022
Сообщений: 36
26.07.2022, 19:30  [ТС] 5
C++
1
2
3
4
5
6
7
8
bool pred(string a, string b) {
    if (a.substr(a.rfind(".") + 1, a.size()) < b.substr(b.rfind(".") + 1, b.size())) {
        if (a.substr(a.rfind("\\") + 1, a.size()) < b.substr(b.rfind("\\") + 1, b.size())) {
            return true;
        }
    }
    else return false;
}
Так тоже не выходит
0
С чаем беда...
Эксперт CЭксперт С++
9993 / 5345 / 1461
Регистрация: 18.10.2014
Сообщений: 12,864
26.07.2022, 19:32 6
Цитата Сообщение от delazario Посмотреть сообщение
и сгруппировать по расширению файла.
Что такое "сгруппировать"?

Если файлы отсортировать по расширению (как главный критерий сортировки) - то они тоже сгруппируются по расширению. Это будет "сгруппировать"? Или "сгруппировать" определяется как-то по-другому?
0
1 / 1 / 0
Регистрация: 23.01.2022
Сообщений: 36
26.07.2022, 19:41  [ТС] 7
Цитата Сообщение от delazario Посмотреть сообщение
if (a.substr(a.rfind("") + 1, a.size()) < b.substr(b.rfind("") + 1, b.size()))
Компилятор жалуется когда я сравниваю 2 параметра, только со знаком меньше получилось.

Добавлено через 3 минуты
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Что такое "сгруппировать"?
Если файлы отсортировать по расширению (как главный критерий сортировки) - то они тоже сгруппируются по расширению. Это будет "сгруппировать"? Или "сгруппировать" определяется как-то по-другому?
Думаю это тоже можно назвать группировкой. Сам долго пытался понять, что от меня точно хотят. Только если группировать по расширению и имени - получается каша.
0
287 / 191 / 93
Регистрация: 12.02.2019
Сообщений: 750
26.07.2022, 19:41 8
Лучший ответ Сообщение было отмечено delazario как решение

Решение

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
string getName(string s)
{
    string nm="";
    int p=s.find('.');
    for(int i=(p>=0?p-1:s.size())-1; s[i]!='\\'; i--)       nm=s[i]+nm;
    return nm;
}
string getExt(string s)
{
    string ext="";
    for(int i=s.size()-1; s[i]!='.'; i--)
    {
        if(s[i]=='\\')
        {
            ext="";
            break;
        }
        ext=s[i]+ext;
    }
    return ext;
}
int main(int argc,char** argv)
{  
    ifstream f("f.txt");
    vector<string> v;
    string s;
    while(getline(f,s))
        v.push_back(s);
    //пузырек
    for(int i=v.size()-1; i; i--)
        for(int j=0; j<i; j++)
            if(getExt(v[j])==getExt(v[i]) && getName(v[j])>getName(v[i])|| getExt(v[j])>getExt(v[i]))
                swap(v[j],v[i]);
 
    for(int i=0; i<(int)v.size(); i++)
        cout<<v[i]<<endl;
    system("pause");
    return 0;
}
Код
f.txt
D:\Documents\OP\list\list1\text.txt
D:\Documents\OP\list\list2\document.docx
D:\Documents\OP\list\list3\program.cpp
D:\Documents\OP\list\list2\2text.txt
D:\Documents\OP\list\list1\2document.docx
D:\Documents\OP\list\list3\2program.cpp
1
5233 / 2887 / 1208
Регистрация: 07.02.2019
Сообщений: 7,284
26.07.2022, 19:44 9
delazario, так пойдет?
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
#include <iostream>
#include <string_view>
#include <vector>
#include <algorithm>
#include <tuple>
 
std::string_view get_ext(std::string_view s) {
  return s.substr(s.rfind('.')); // гомнокод
}
 
std::string_view get_name(std::string_view s) {
  return s.substr(s.rfind('\\'), s.rfind('.') - s.rfind('\\')); // хуже чем гомнокод
}
 
bool pred(std::string_view a, std::string_view b) {
    return std::make_tuple(get_ext(a), get_name(a)) < std::make_tuple(get_ext(b), get_name(b));
}
 
int main()
{
  std::vector<std::string_view> vec{
    R"(D:\Documents\OP\list\list1\text.txt)",
    R"(D:\Documents\OP\list\list2\document.docx)",
    R"(D:\Documents\OP\list\list3\program.cpp)",
    R"(D:\Documents\OP\list\list2\2text.txt)",
    R"(D:\Documents\OP\list\list1\2document.docx)",
    R"(D:\Documents\OP\list\list3\2program.cpp)",
  };
  std::sort(vec.begin(), vec.end(), pred);
  for (auto s : vec)
    std::cout << s << std::endl;
}
1
287 / 191 / 93
Регистрация: 12.02.2019
Сообщений: 750
26.07.2022, 19:46 10
результат
Миниатюры
Одновременная сортировка по имени файла и группировка по расширению  
1
1 / 1 / 0
Регистрация: 23.01.2022
Сообщений: 36
26.07.2022, 19:49  [ТС] 11
Вот, что должно получаться:
\Documents\OP\list\list1\2docu ment.docx
\Documents\OP\list\list2\docum ent.docx
\Documents\OP\list\list3\2prog ram.cpp
\Documents\OP\list\list3\progr am.cpp
\Documents\OP\list\list2\2text .txt
\Documents\OP\list\list1\text. txt .

Добавлено через 55 секунд
Цитата Сообщение от CoderPC Посмотреть сообщение
результат
у меня так же выходит тут:
C++
1
2
3
4
5
6
7
8
bool pred(string a, string b) {
    if (a.substr(a.rfind(".") + 1, a.size()) < b.substr(b.rfind(".") + 1, b.size())) {
        if (a.substr(a.rfind("\\") + 1, a.size()) < b.substr(b.rfind("\\") + 1, b.size())) {
            return true;
        }
    }
    else return false;
}
0
287 / 191 / 93
Регистрация: 12.02.2019
Сообщений: 750
26.07.2022, 19:52 12
A,B,???, docx раньше cpp?
0
1 / 1 / 0
Регистрация: 23.01.2022
Сообщений: 36
26.07.2022, 19:57  [ТС] 13
Цитата Сообщение от CoderPC Посмотреть сообщение
A,B,???, docx раньше cpp?
Имена файлов по алфавиту, расширения должны друг с дружкой находиться.

Цитата Сообщение от zayats80888 Посмотреть сообщение
#include <iostream>
#include <string_view>
#include <vector>
#include <algorithm>
#include <tuple>
std::string_view get_ext(std::string_view s) {
return s.substr(s.rfind('.')); // гомнокод
}
std::string_view get_name(std::string_view s) {
return s.substr(s.rfind('\\'), s.rfind('.') - s.rfind('\\')); // хуже чем гомнокод
}
bool pred(std::string_view a, std::string_view b) {
return std::make_tuple(get_ext(a), get_name(a)) < std::make_tuple(get_ext(b), get_name(b));
}
int main()
{
std::vector<std::string_view> vec{
R"(D:\Documents\OP\list\list1\ text.txt)",
R"(D:\Documents\OP\list\list2\ document.docx)",
R"(D:\Documents\OP\list\list3\ program.cpp)",
R"(D:\Documents\OP\list\list2\ 2text.txt)",
R"(D:\Documents\OP\list\list1\ 2document.docx)",
R"(D:\Documents\OP\list\list3\ 2program.cpp)",
};
std::sort(vec.begin(), vec.end(), pred);
for (auto s : vec)
std::cout << s << std::endl;
}
Точно такой же результат у меня в предикате, который я вам кинул.
0
287 / 191 / 93
Регистрация: 12.02.2019
Сообщений: 750
26.07.2022, 20:01 14
Лучший ответ Сообщение было отмечено delazario как решение

Решение

C++
1
2
3
4
5
6
    //пузырек
    for(int i=v.size()-1; i; i--)
        for(int j=0; j<i; j++)
            if(getExt(v[j])==getExt(v[i]) && getName(v[j])>getName(v[i])|| getExt(v[j]).size()<getExt(v[i]).size()|| 
                getExt(v[j]).size()==getExt(v[i]).size() && getExt(v[j])>getExt(v[i]))
                swap(v[j],v[i]);
1
5233 / 2887 / 1208
Регистрация: 07.02.2019
Сообщений: 7,284
26.07.2022, 20:04 15
Цитата Сообщение от delazario Посмотреть сообщение
Вот, что должно получаться:
Ну если прям именно это, то сортируешь по имени, а потом группируешь(по типу сортировки вставками) по расширению, т.е. берешь первый элемент и проходишь оставшийся диапазон "вынимая и вставляя" после первого элементы с тем же расширением(сохраняя порядок), назначаешь первым следующий за последним "всавленным" и так по кругу...
1
1 / 1 / 0
Регистрация: 23.01.2022
Сообщений: 36
26.07.2022, 20:18  [ТС] 16
Цитата Сообщение от CoderPC Посмотреть сообщение
//пузырек
for(int i=v.size()-1; i; i--)
for(int j=0; j<i; j++)
if(getExt(v[j])==getExt(v[i]) && getName(v[j])>getName(v[i])|| getExt(v[j]).size()<getExt(v[i]).size()||
getExt(v[j]).size()==getExt(v[i]).size() && getExt(v[j])>getExt(v[i]))
swap(v[j],v[i]);
Выводит то же самое.

Добавлено через 20 секунд
Цитата Сообщение от zayats80888 Посмотреть сообщение
Ну если прям именно это, то сортируешь по имени, а потом группируешь(по типу сортировки вставками) по расширению, т.е. берешь первый элемент и проходишь оставшийся диапазон "вынимая и вставляя" после первого элементы с тем же расширением(сохраняя порядок), назначаешь первым следующий за последним "всавленным" и так по кругу...
Сейчас попытаюсь сообразить.
0
287 / 191 / 93
Регистрация: 12.02.2019
Сообщений: 750
26.07.2022, 20:22 17
Цитата Сообщение от delazario Посмотреть сообщение
Выводит то же самое.
???
Миниатюры
Одновременная сортировка по имени файла и группировка по расширению  
1
1 / 1 / 0
Регистрация: 23.01.2022
Сообщений: 36
26.07.2022, 20:27  [ТС] 18
Цитата Сообщение от CoderPC Посмотреть сообщение
???
У меня по-другому, попробую еще раз

Добавлено через 4 минуты
Цитата Сообщение от CoderPC Посмотреть сообщение
???
Огромное спасибо! Дай бог тебе здоровья, радости и личной жизни)
0
5233 / 2887 / 1208
Регистрация: 07.02.2019
Сообщений: 7,284
26.07.2022, 20:28 19
Цитата Сообщение от delazario Посмотреть сообщение
Сейчас попытаюсь сообразить.
Можешь std::stable_partition использовать для группировки и не заморачиваться...
1
1 / 1 / 0
Регистрация: 23.01.2022
Сообщений: 36
26.07.2022, 20:29  [ТС] 20
Цитата Сообщение от zayats80888 Посмотреть сообщение
Можешь std::stable_partition использовать для группировки и не заморачиваться...
Та уже парень помог, я в шоке с сортировки на 1 курсе.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.07.2022, 20:29
Помогаю со студенческими работами здесь

MediaPlayer: "Не удается определить тип устройства по указанному расширению имени файла"
Здравствуйте. Кому нетрудно подскажите в чем ошибка: case Form1.DBGrid1.SelectedRows.Count of ...

MediaPlayer - ошибка "Не удается определить тип устройства по указанному расширению имени файла"
Почему это программа не работает unit Unit1; interface uses Windows, Messages,...

Сортировка по имени файла
Здраствуйте! Имеются файлы такого вида и типа: 2015-12-01_11-45-35_ФотонК-1234_7_-_742.xml, как...

Ls сортировка по имени файла
Здравствуйте! Мне нужно банально вытащить последний (по алфавиту) файл из папки, где хранятся файлы...

Сортировка картинок по имени файла
Собственно говоря я уже получил содержимое требуемой папки с помощью следующего кода: if...

Сортировка файлов по расширению
Всем привет. Никак не могу родить такой алгоритм: Вот допустим есть папка с различными файлами,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru