C ++ Алфавитная сортировка строк в векторах векторов - PullRequest
0 голосов
/ 01 июля 2019
nm92,Nate,Matthews,Aetna,1
sc91,Steve,Combs,Cigna,2
ml94,Morgan,Lands,BCBS,3
kb93,Kyle,Borris,Aetna,2

Я пытаюсь взять входной файл CSV, как описано выше, сохранить его, отсортировать по страховке (столбец 4), а затем записать его в файлы сравнения, основанные на страховке, но в алфавитном порядке по фамилии.

Итак, в этой программе у меня есть вектор уникальных страховок, у которых, в свою очередь, есть вектор зачисленных. Именно этот вектор поступающих я хочу отсортировать в алфавитном порядке по фамилии (столбец 3), чтобы, если uniqueInsurances [0] .name было Aetna, то uniqueInsurances [0] .enrollees [] получило список Кайла Борриса ДО Нейта Мэттьюса. Прямо сейчас я храню его в другом месте с Нейтом Мэтьюсом, перечисленным перед Кайлом Боррисом.

Я думаю, что это связано с вектором векторов и вложенными циклами, необходимыми для этой проблемы, и это меня запутывает, поэтому мне было интересно, может ли кто-нибудь помочь мне с точки зрения наилучшего способа сортировки векторов зачисленных для каждого уникального страхования

struct enrollee
{
    string userid = "";
    string fname = "";
    string lname = "";
    string insurance = "";
    string version = "";
};

struct uniqueInsurance
{
    string name = "";
    int numEnrollees = 0;
    vector <enrollee> enrollVector;
};

Ответы [ 2 ]

1 голос
/ 01 июля 2019

Если ваша задача просто записать в разные файлы отсортированные имена, тогда вам не нужна вторая структура. Просто сделайте один std::vector<enrollee> сортировку по страховке и именам, затем итерируйте. При изменении названия страховки, заново откройте файл:

std::vector<enrollee> enrollees;
// read them from csv file
std::sort( enrollees.begin(), enrollees.end(), []( const enrollee &e1, const enrollee &e2 ) {
    return std::tie( e1.insurance, e1.fname, e1.lname ) < std::tie( e2.insurance, e2.fname, e2.lname );
} );
std::string insurance;
std::ofstream out;
for( const auto &e : enrollees ) {
    if( insurance != e.insurance ) {
        insurance = e.insurance;
        out.open( insurance + ".csv" );
    }
    out << e.fname << ',' << e.lname << std::endl;
}

Это сортирует по имени, затем по фамилии, если вам нужна фамилия, просто поменяйте местами их порядок в std::tie()

0 голосов
/ 01 июля 2019

Это продолжение вашего вопроса вчера:

Оригинальный вопрос

Я изменил свой код и добавил одну строку для сортировки.

Пожалуйста, смотрите:

#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <regex>


struct Enrollee
{
    // Data
    std::string userid{};
    std::string fname{};
    std::string lname{};
    std::string insurance{};
    std::string version{};

    // Overload Extractor Operator to read data from somewhere
    friend std::istream& operator >> (std::istream &is, Enrollee& e) {
        std::vector<std::string> wordsInLine{};       // Here we will store all words that we read in onle line;
        std::string wholeLine;                        // Temporary storage for the complete line that we will get by getline
        std::regex separator("[ \\;\\,]"); ;          // Separator for a CSV file
        std::getline(is, wholeLine);                  // Read one complete line and split it into parts
        std::copy(std::sregex_token_iterator(wholeLine.begin(), wholeLine.end(), separator, -1), std::sregex_token_iterator(), std::back_inserter(wordsInLine));
        // If we have read all expted strings, then store them in our struct
        if (wordsInLine.size() == 5) {
            e.userid = wordsInLine[0];
            e.fname = wordsInLine[1];
            e.lname = wordsInLine[2];
            e.insurance = wordsInLine[3];
            e.version = wordsInLine[4];
        }
        return is;
    }

    // Overload Inserter operator. Insert data into output stream
    friend std::ostream& operator << (std::ostream& os, const Enrollee& e) {
        return os << "userid is:    " << e.userid << "\nfname is:     " << e.fname << "\nlname is:     " << e.lname << "\ninsurance is: " << e.insurance << "\nversion is:   " << e.version << '\n';
    }
};


int main()
{
    // Her we will store all Enrollee data in a dynamic growing vector
    std::vector<Enrollee> enrollmentData{};

    // Define inputFileStream and open the csv
    std::ifstream inputFileStream("r:\\input.csv");

    // If we could open the file
    if (inputFileStream) 
    {

        // Then read all csv data
        std::copy(std::istream_iterator<Enrollee>(inputFileStream), std::istream_iterator<Enrollee>(), std::back_inserter(enrollmentData));

        // Sort the data
        std:sort(enrollmentData.begin(),enrollmentData.end(),[](const Enrollee& left, const Enrollee& right){return left.lname < right.lname;});

        // For Debug Purposes: Print all data to cout
        std::copy(enrollmentData.begin(), enrollmentData.end(), std::ostream_iterator<Enrollee>(std::cout, "\n"));
    }
    else {
        std::cerr << "Could not open file 'input.csv'\n";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...