首页 > 解决方案 > 按字母顺序排序结构数组

问题描述

我有一个名为 Sheep 的结构数组 (A[#])(因为我的任务是关于羊 DNR)。在我完成任务要求的任何事情之后,我只剩下这个结构:

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

在我的里面,数据是:

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

(char Fragmentas[CMax] 不会使用,所以你不必看它,我只是为了清楚起见而命名它)。

所有这些数据都来自 U2.txt 文件,不能手动输入代码。

剩下要做的就是按照以下规则对其进行排序:

  1. 'int atitikme' 从大到小。
  2. 如果 'int atitikme' 相等,则必须按字母顺序按 'A[#].Vardas 排序。

为了按'int atitikme'对其进行排序,我创建了一个代码:

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 | 米 = 6

我需要如何/什么添加到此代码中才能使其生效:

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

如果 'atitikme' 是 == 另一个 'atitikme' 则 A[p].Vardas 和 A[o].Vardas 必须按字母顺序排序。但只有整个阵列中的 2 个。

或者,如果它太难理解我的意思,任何人都可以在答案框中发布代码,它是否会在 2 个字符串之间按字母顺序排序?

注意:整行数据

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

必须保持不变,只有行中的位置必须不同,并按照我之前提到的那些规则进行排序。

输出应该是:

Bailioji   3
Baltukas   3
Smarkuolis 1

编辑:我当前的输出是:

Baltukas   3
Bailioji   3
Smarkuolis 1

附言。该任务允许使用它的 C++ 的所有内容,并且不必创建或读取任何其他文件。

标签: c++algorithmsortingc++11stdvector

解决方案


在这里,我使用std::vector<>而不是数组来存储羊。其次,使用std::sort()and 一个lambda函数,你可以很容易地提到你想如何对std::vector<>/中的元素进行排序Sheeps。那将是最容易接近的方法。

这是实时代码,以防审查: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;
}

输出:

Bailioji 3
Baltukas 3
Kmarkuolis 2
Hmarkuolis 1
Smarkuolis 1

推荐阅读