【问题标题】:Shuffle parts of a QList随机播放 QList 的各个部分
【发布时间】:2014-10-29 00:38:53
【问题描述】:

我有一个列表,我想在这个列表中进行 3 种不同的随机播放,如下所示:

  • 1º shuffle:前十项;
  • 2º shuffle:从第 11 项到第 20 项;
  • 3º shuffle:从第 21 项到结尾

这是我到目前为止所做的:

QList<QString> list;

list << "a" << "b" << ...

    std::random_shuffle(list.begin(), list.begin()+10);
    list.takeFirst();
    QString shuffle1 = list.takeFirst();

    std::random_shuffle(list.begin()+11, list.begin()+20);
    list.takeFirst();
    QString shuffle2 = list.takeFirst();

    std::random_shuffle(list.begin()+21, list.end());
    list.takeFirst();
    QString shuffle3 = list.takeFirst();enter code here

但它不起作用。有什么想法吗?提前致谢!

【问题讨论】:

    标签: c++ qt qstring qtcore qlist


    【解决方案1】:

    我不知道你为什么在忽略第一个的时候去掉两个项目,但我认为主要的问题是你试图用项目完好无损的逻辑来洗牌,而你在调用 list.takeFirst() 时实际上删除了项目在洗牌电话之间。因此,改组将不再像您预期的那样对原始文件起作用。

    以下是一些解决此问题的示例代码:

    main.cpp

    #include <QStringList>
    #include <QDebug>
    #include <algorithm>
    
    int main()
    {
        // You better generate this test data for 30 items...
        QStringList stringList{"a1", "b2", "c3", "d4", "e5", "f6"};
        static const int sliceSize = 2;
    
        for (int i = 0; i < stringList.size(); i+=sliceSize) {
            std::random_shuffle(stringList.begin() + i, stringList.begin() + (i+sliceSize-1));
            qDebug() << stringList.mid(i, sliceSize);
        }
    
        return 0;
    }
    

    main.pro

    TEMPLATE = app
    TARGET = main
    QT = core
    CONFIG += c++11
    SOURCES += main.cpp
    

    构建并运行

    qmake && make && ./main
    

    输出

    ("a1", "b2")
    ("c3", "d4")
    ("e5", "f6")
    

    【讨论】:

    • 感谢您的回答,但我的问题并不清楚。首先我使用 .takeFirst 因为我不想在随机播放中重复值。其次,范围不是固定的(前 10 个,然后是下一个 8,然后是下 7 个(我知道我写了 10 个范围(我的错))。毕竟,我将对所有剩余元素进行最后一次洗牌列表。而且不能重复。我是怎么做到的?thks
    • @Rafaelpsmed:请给出预期的输入和输出。希望它会更容易理解你想要实现的目标。在这一点上,我听起来有点不理解。
    • 好吧,就像这样:我有一个包含 60 个项目的列表。最终输出将是这 60 个初始项目中的 6 个项目。首先我需要洗牌前 10 个项目并选择一个,然后洗牌接下来的 9 个项目并选择一个,然后再洗好接下来的 8 个项目并选择一个。到目前为止3个项目。接下来,我将整个列表打乱并选择另外 3 个项目。一共做6个项目。并且项目不能重复
    • @Rafaelpsmed:有趣的算法,但这究竟是为了什么?当您尝试选择时结果列表中存在字符串时会发生什么,您正在尝试选择下一个?另外,究竟是什么不起作用?尽管如此,根据您更新的问题描述,list.takeFirst(); 调用似乎没有意义。
    • 这是我父亲的彩票应用程序(他相信某些数字比其他数字更好)这就是为什么我想洗牌部分列表(因为是他的“魔术数字”)然后整个像我说的那样列出。如果 list.takeFirst 没有意义,我应该用什么将每个 shuffle 的结果放在一个字符串中以显示给用户?
    猜你喜欢
    • 1970-01-01
    • 2014-09-11
    • 2023-01-23
    • 2014-12-30
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 2020-10-03
    相关资源
    最近更新 更多