Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sort structure array in alphabetical order

I have a structure array (A[#]) named Sheep (since my task is about sheeps DNR). After I do whatever the task asked I am left with this struct :

struct Sheep 
{
    string Vardas;
    char Fragmentas[CMax]; 
    int atitikme = 0; 
};

and inside my it the data is:

(string Vardas) | (char Fragmentas[CMax]) | (int atitikme)
Baltukas   TAGCTT 3
Bailioji   ATGCAA 3 
Smarkuolis AATGAA 1 

(char Fragmentas[CMax] won't be using so u don't have to look at it, I only named it to make it clear).

ALL of this data comes from U2.txt file and cant be manually typed in a code.

All its left to do is to sort it by these rules:

  1. It goes from bigger to smaller by 'int atitikme'.
  2. IF 'int atitikme' is equal then it will have to sort by 'A[#].Vardas in a in alphabetical order.

To sort it by 'int atitikme' I created a code:

string q;
char w[20];
int e;
for (int o = 0; o < n-1; o++) 
{
    for (int p = o+1; p < n-1; p++) 
    {
        if (A[p].atitikme > A[o].atitikme) 
        {
            // - Vardo Keitimas
            q = A[o].Vardas;
            A[o].Vardas = A[p].Vardas;
            A[p].Vardas = q;
            // - A[#].atitikme keitimas
            e = A[o].atitikme;
            A[o].atitikme = A[p].atitikme;
            A[p].atitikme = e;
            // - DNR farkmentu keitimas
            for (int r = 0; r < m; r++) 
            {
                w[r] = A[o].Fragmentas[r];
                A[o].Fragmentas[r] = A[p].Fragmentas[r];
                A[p].Fragmentas[r] = w[r];
             }
        }
    }
}

n = 4 | m = 6

How/what do i need to add to this code to make it go:

else if (A[p].atitikme == A[o].atitikme) 
{
    <code>
}

That if 'atitikme' is == to another 'atitikme' then A[p].Vardas and A[o].Vardas has to be sorted in an alphabetical order. but only those 2 from the whole array.

OR if its too hard to understand what I meant, could anyone post a code, in the answer box, were it would sort in a alphabetical order between 2 string's?

NOTE: the whole line data

(string Vardas) (char Fragmentas[CMax]) (int atitikme)

has to stay the same, only the place in the line has to be diffirent and sorted by those rules I mentioned before.

The output should be:

Bailioji   3
Baltukas   3
Smarkuolis 1

EDIT: My current output is:

Baltukas   3
Bailioji   3
Smarkuolis 1

P.s. The task allows to use everything as-long as its C++ and does not have to create, or read, any other file.

like image 543
Lith Avatar asked Jan 29 '23 03:01

Lith


1 Answers

Here I have used std::vector<> instead of array to store the sheeps. Secondly, using std::sort() and a lambda function, you can easily mention how you want to sort the elements in the std::vector<>/ Sheeps. That would be the easiest way to approach.

Here is the live code, in case of reviewing: https://www.ideone.com/ay7TWU

#include <iostream>
#include <vector>
#include <algorithm>

struct Sheep
{
   std::string Vardas;
   std::vector<char> Fragmentas;
   int atitikme;
};

int main()
{
  std::vector<Sheep> vec =
   {
      {"Baltukas",  {'T','A','G','C','T','T'}, 3},
      {"Bailioji",  {'A','T','G','C','A','A'}, 3},
      {"Smarkuolis",{'A','A','T','G','A','A'}, 1},
      {"Hmarkuolis",{'A','A','T','G','A','A'}, 1},
      {"Kmarkuolis",{'A','A','T','G','A','A'}, 2}
   };

   std::sort(vec.begin(), vec.end(), [](const Sheep& lhs, const Sheep& rhs)
      {
         return (lhs.atitikme == rhs.atitikme) ? 
            lhs.Vardas < rhs.Vardas: // if atitikme's of sheeps are equal
            lhs.atitikme > rhs.atitikme; // if atitikme's of sheeps are not equal
      });

    for (const auto& it: vec)
        std::cout << it.Vardas << " " << it.atitikme << "\n";

    return 0;
}

The output:

Bailioji 3
Baltukas 3
Kmarkuolis 2
Hmarkuolis 1
Smarkuolis 1
like image 104
JeJo Avatar answered Feb 06 '23 15:02

JeJo