Multiset的使用

Multiset和Set的区别就是可以保存多个相同的对象。在JDK中,List和Set有一个基本的区别,就是List可以包含多个相同对象,且是有顺序的,而Set不能有重复,且不保证顺序(有些实现有顺序,例如LinkedHashSet和SortedSet等)所以Multiset占据了List和Set之间的一个灰色地带:允许重复,但是不保证顺序。 

 

Multiset提供多种实现,主要有:

    HashMultiset: 元素存放于HashMap

    LinkedHashMultiset: 元素存放于 LinkedHashMap,即元素的排列顺序由第一次放入的顺序决定

    TreeMultiset:元素被排序存放于TreeMap

    EnumMultiset: 元素必须是 enum 类型

    ImmutableMultiset: 不可修改的 Mutiset

 

常见使用场景:Multiset有一个有用的功能,就是跟踪每种对象的数量,所以你可以用来进行数字统计。 

//构造一个数据集合对象
	    String strWorld = "wer|dffd|ddsa|dfd|dreg|de|dr|ce|ghrt|cf|gt|ser|tg|ghrt|cf|gt|" +
                "ser|tg|gt|kldf|dfg|vcd|fg|gt|ls|lser|dfr|wer|dffd|ddsa|dfd|dreg|de|dr|" +
                "ce|ghrt|cf|gt|ser|tg|gt|kldf|dfg|vcd|fg|gt|ls|lser|dfr";
        String[] words = strWorld.split("\\|");
        
        List<String> wordList = new ArrayList<String>();
        for (String word : words) {
            wordList.add(word);
        }
        
        //将数据集添加到Multiset中
        Multiset<String> wordsMultiset = HashMultiset.create();
        wordsMultiset.addAll(wordList);
     
        //elementSet(): 将不同的元素放入一个Set中
        //count(Object element):返回给定参数元素的个数
        for(String key : wordsMultiset.elementSet()){
            System.out.println(key + " count:" + wordsMultiset.count(key));
        }

 

 执行结果如下:

lser count:2

kldf count:2

dfr count:2

ls count:2

ser count:3

tg count:3

dreg count:2

de count:2

vcd count:2

ddsa count:2

dfd count:2

ghrt count:3

fg count:2

dffd count:2

dfg count:2

wer count:2

gt count:7

ce count:2

cf count:3

dr count:2

Almeza MultiSet可通过软件安装管理器将常用程序集成到一起,它先录制软件的安装过程,下次安装同一软件时就会采用“回放”的方式,只需轻轻一点,即可实现软件的全自动安装,从而避免输入用户名、序列号和点击下一步的麻烦。以全自动安装QQ为例,看看它是如何实现软件全自动安装的。   1.安装Almeza MultiSet后启动程序,默认情况下程序界面为英文。单击菜单栏的Service→options命令打开选项窗口,单击Select the language of the program interface(选择程序界面语言)下拉列表,从中选择Chinese:simplified,单击OK按钮即可将界面汉化。   2.启动MultiSet,在程序左侧窗格中是欲自动安装的软件类别,默认情况下有3个,右侧窗格中是程序列表,默认情况下有1个例子。为符合使用习惯,首先将左侧窗格中的Multimedia修改为“多媒体工具”,Internet修改为“网络工具”,Utilities修改为“系统工具”,方法是在相应的选项上单击右键,选择“重命名”。最后再在右侧窗格的例子上右键单击,选择“删除”。这样程序就好比是一张白纸了,你可以在其上画最美最真的画。   3.为了方便以后软件安装管理,可为应用软件建立分类。在“类别”标签上右键单击,选择“新类别”,在弹出的对话框中命名类别。在左侧窗格中选择一个类别,如“网络工具”。   4.在右侧窗格中右键单击,选择“新建记录包”命令,在弹出的对话框中选择安装程序的位置和名称。单击“可执行文件”文本框后面的“浏览”按钮,打开已经下载回来的QQ安装程序,“名称”文本框会自动填充。为方便记忆,可以在“描述”文本框中输入描述信息,如“安装QQ Beta3”,最后单击“确定”按钮。   5.这时会出现程序的录制界面和QQ安装程序向导,一步步安装QQ完成后,单击录制窗口中的停止按钮,完成QQ自动化安装的录制工作。   6.重复上面的操作,为每一个常用的软件都录制一个安装过程。录制了软件的安装过程后,必须保证软件的安装程序源位置不再更改,否则会找不到软件的安装文件而无法实现将来的自动安装。   7.需要全自动安装时,启动MultiSet,选中需要安装的软件,即将软件选项前打上对钩。单击菜单栏的“服务→安装”,MultiSet就会全自动地一一将软件安装到位。   小提示:如果需要将MultiSet中的所有程序安装到位,那么直接选择“安装所有”即可
### C++ 中 multiset使用方法及定义示例 #### 1. multiset 的基本概念 `std::multiset` 是 C++ 标准库中的关联容器,允许存储多个具有相同值的元素,并且默认按照升序排列[^1]。与 `std::set` 不同,`std::multiset` 允许重复元素的存在。 #### 2. multiset 的定义与初始化 以下是 `std::multiset` 的几种常见定义和初始化方式: ```cpp #include <iostream> #include <set> int main() { // 使用初始化列表创建 multiset std::multiset<int> multiset1 = {1, 2, 2, 3, 4}; // 使用拷贝构造函数 std::multiset<int> multiset2(multiset1); // 使用赋值操作 std::multiset<int> multiset3; multiset3 = multiset2; // 单个元素插入 std::multiset<int> multiset4; multiset4.insert(5); } ``` #### 3. 自定义比较函数 如果需要对 `std::multiset` 的元素进行自定义排序,可以定义一个比较函数或比较结构体,并将其作为模板参数传递给 `std::multiset`。以下是一个示例: ```cpp #include <iostream> #include <set> #include <string> // 定义键类型为结构体 struct Key { int id; std::string name; }; // 定义比较函数对象 struct Compare { bool operator()(const Key& a, const Key& b) const { if (a.id != b.id) { return a.id < b.id; // 首先按 id 排序 } return a.name < b.name; // 如果 id 相同,则按 name 排序 } }; int main() { // 使用自定义比较函数创建 multiset std::multiset<Key, Compare> customMultiset; // 插入元素 customMultiset.insert({1, "Alice"}); customMultiset.insert({1, "Bob"}); customMultiset.insert({2, "Charlie"}); // 遍历 multiset for (const auto& key : customMultiset) { std::cout << "Key: (" << key.id << ", " << key.name << ")" << std::endl; } return 0; } ``` #### 4. 常见使用函数 以下是一些常用的 `std::multiset` 成员函数及其用法: - **`insert()`**:插入元素。 - **`erase()`**:删除指定元素或特定位置的元素。 - **`find()`**:查找指定元素的第一个匹配项。 - **`count()`**:统计指定元素的出现次数。 - **`lower_bound()` 和 `upper_bound()`**:返回指向第一个不小于或大于指定值的迭代器。 - **`swap()`**:交换两个 `std::multiset` 的内容[^2]。 示例代码如下: ```cpp #include <iostream> #include <set> int main() { std::multiset<int> myMultiset = {1, 2, 2, 3, 4}; // 查找值为 2 的所有元素 auto range = myMultiset.equal_range(2); for (auto it = range.first; it != range.second; ++it) { std::cout << "Found: " << *it << std::endl; } // 统计值为 2 的出现次数 std::cout << "Count of 2: " << myMultiset.count(2) << std::endl; // 删除值为 2 的所有元素 myMultiset.erase(2); // 遍历 multiset for (const auto& value : myMultiset) { std::cout << value << " "; } std::cout << std::endl; return 0; } ``` #### 5. 注意事项 - 如果元素是自定义类型(如结构体),必须提供有效的比较函数以确保严格弱序关系[^3]。 - 默认情况下,`std::multiset` 按照元素的升序排列。如果需要降序排列,可以在比较函数中反转逻辑。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值