qt中QList去重与统计重复次数

本文介绍了如何在C++中利用QList去除重复值以及使用QMap统计QList中元素的重复次数。首先,通过遍历QList并移除重复项实现去重,然后使用QMap存储元素及其出现次数,实现对重复值的计数。最终展示的示例分别展示了去重后的QList和QMap中元素及对应的计数值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、去除QList中得重复值

二、找出list得重复值和重复值得个数


       

本来我是想建立三个QList链表,

        A链表放原始数据

        B链表放不重复得数据

        C链表放每个数据重复得总数

        但是很快我就发现了一个问题,我不知道如何把B和C连接起来,以及如何让QList得某个值自加1。

        在通过百度得帮助下,我发现了可以用Map键值对来解决这个问题。

        参考链接:如何找出list中重复的数据以及重复数据的个数

        由于该链接得语法是Java,所以我自己做了些修改。具体操作过程如下:

一、去除QList中得重复值

        ps:代码写在Mainwindow.cpp中

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QDebug>
#include <QList>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QList<QString> m_ListAllSrt;
    m_ListAllSrt.clear();

    m_ListAllSrt = {"a", "a", "b", "b", "c", "c"};

    for(int i=0; i<m_ListAllSrt.size(); i++)
    {
        for(int j=i+1; j<m_ListAllSrt.size(); j++)
        {
            if(m_ListAllSrt.at(i) == m_ListAllSrt.at(j))
            {
                m_ListAllSrt.removeAt(j);
                m_ListCount.append(1);
                j--;
            }
        }
    }

    qDebug() << "m_ListAllStr:";
    for(int k=0; k<m_ListAllSrt.size(); k++)
    {
        qDebug() << m_ListAllSrt.at(k);
    }
}

输出结果:

"a"

"b"

"c"

二、找出list得重复值和重复值得个数

 这里需要用到QMap键值对,已知当QMap添加了重复键,QMap会保存最后一次添加得键值对。

借助参考链接得逻辑思路,具体代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QDebug>
#include <QMap>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QList<QString> m_ListStr;
    m_ListStr.clear();

m_ListStr = {"a", "a", "a", "a", "a", "a","b", "b", "b", "c", "c","a", "a","c", "c", "d"};

    QMap<QString, int> mapStrInt;

    int count=1;
    for(int i=0; i<m_ListStr.size(); i++)
    {
        if( nullptr != mapStrInt.find(m_ListStr.at(i)).key())
        {
            mapStrInt.insert(m_ListStr[i], mapStrInt.find(m_ListStr[i]).value()+1);
        }
        else
        {
            mapStrInt.insert(m_ListStr[i], count);
        }


    }


    qDebug() << "mapStrInt:";
    QMap<QString, int>::Iterator it = mapStrInt.begin();
    while(it!=mapStrInt.end())
    {
        qDebug() << it.key() << it.value();
        it++;
    }
}

运行结果:

“a” 8

"b" 2

"c" 4

"d" 1

<think>好的,我需要解决用户的问题,即如何使用Qt获取两个数组的交集及交集中元素的数量。首先,我得回忆一下Qt的容器类和相关方法。用户提到了QSet和QHash的底层实现,这可能交集操作有关。 首先,QSet是基于QHash实现的,所以它提供了高效的集合操作,比如交集、并集等。根据引用[1],QSet使用QHash来存储元素,因此它的查找和插入操作应该是常数时间的。这可能是实现交集的高效方法。 接下来,用户需要比较两个数组,找出共同的元素及其数量。数组可能使用的是QVector或QList。根据引用[3],QList和QVector有类似的API,但性能可能不同。这里选择QVector或QList都可以,但需要保持一致性。 步骤可能是这样的: 1. 将两个数组转换为QSet,利用集合的特性快速和查找。 2. 使用QSet的intersect方法或者&操作符来获取交集。 3. 统计交集中的元素数量,直接调用size()方法。 4. 如果需要保留原始顺序或复元素,可能需要其他处理,但用户的问题中没有提到,所以假设只需要唯一元素。 然后考虑示例代码的结构。需要包含必要的头文件,比如QSet、QVector、QDebug等。主函数中创建两个数组,转换为QSet,求交集,然后输出结果。 可能的注意事项: - 如果数组中有复元素,转换为QSet会自动,所以交集元素的数量是唯一值的数量。用户是否需要统计重复次数?问题描述中只提到元素的数量,可能指唯一元素的数量。 - 是否需要保持元素的顺序?如果不需要,使用QSet是合适的。 另外,根据引用[2],用户可能已经熟悉使用QList和QVector的组合,所以示例中使用QVector<int>作为数组类型是合理的。 编写代码时,需要注意Qt的语法,比如使用QVector::toSet()方法,但需要确认该方法是否存在。在较新的Qt版本中,QVector可能没有toSet(),而需要转换为QList,或者使用QSet的构造函数。或者可能需要使用QSet<T>的fromList方法,但需要查阅文档确认。 例如,正确的方法可能是: QSet<int> set1 = QSet<int>::fromList(array1.toList()); 但需要注意,Qt的某些版本中,QVector可能需要先转换为QList,或者直接使用迭代器构造QSet。 或者,可以使用C++11的范围构造函数: QSet<int> set1(array1.begin(), array1.end()); 这样更通用,适用于任何容器类型。但需要确保编译器支持C++11。 最后,将交集结果转换为列表或向量,方便输出。统计数量直接使用size()方法。 测试代码时,例如数组1是{1,2,3,3},数组2是{3,4,5},交集应该是{3},数量为1,即使数组1中有复的3。这样验证代码的正确性。 总结步骤: 1. 包含必要的头文件。 2. 创建两个QVector<int>数组。 3. 转换为QSet。 4. 计算交集。 5. 转换回QVector或QList以便输出。 6. 输出结果和数量。 现在将这些步骤转化为示例代码,并添加注释说明。同时,在回答中引用相关引用,比如使用QSet的依据来自引用[1],QVector的使用参考引用[3]。</think>在Qt中获取两个数组的交集及元素数量,可以通过`QSet`的集合运算高效实现。以下是分步说明及示例代码: --- ### **实现步骤** 1. **容器选择**:使用`QVector<int>`存储原始数组,利用`QSet`自动特性处理唯一值[^1][^3] 2. **集合转换**:将`QVector`转为`QSet`,支持快速集合运算 3. **交集计算**:通过`QSet`的`intersect()`方法或`&`运算符获取交集 4. **结果输出**:将交集结果转为`QList`方便遍历,用`size()`统计数量 --- ### **示例代码** ```cpp #include <QVector> #include <QSet> #include <QDebug> int main() { // 原始数组(可包含复元素) QVector<int> array1 = {1, 2, 3, 3, 4}; QVector<int> array2 = {3, 4, 4, 5}; // 转换为QSet QSet<int> set1(array1.begin(), array1.end()); QSet<int> set2(array2.begin(), array2.end()); // 计算交集 QSet<int> intersection = set1 & set2; // 统计数量 int count = intersection.size(); // 输出结果 qDebug() << "交集元素:" << intersection.values(); qDebug() << "元素数量:" << count; return 0; } ``` --- ### **代码说明** 1. **容器转换** `QSet<int>(array.begin(), array.end())`通过迭代器构造集合,自动过滤复值[^3] 2. **集合运算** `set1 & set2`等价于`set1.intersect(set2)`,时间复杂度为$O(n)$[^1] 3. **结果输出** `intersection.values()`将集合转为`QList<int>`,便于调试输出 --- ### **注意事项** - **特性**:`QSet`会忽略复元素,若需统计复出现次数,改用`QMap<int, int>`记录频次 - **性能对比**:`QSet`的集合运算比手动遍历数组更高效($O(n)$ vs $O(n^2)$)[^1] - **扩展应用**:此方法适用于`QStringList`、`QList<double>`等其他数据类型 ---
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值