Map和Set的基本操作

本文深入探讨了Java中Map和Set的数据结构与操作方法,包括HashMap和HashSet的使用,键值对概念,以及如何遍历和操作这些集合。通过实例展示了Map的插入、查找和遍历,以及Set的元素添加和存在性检查。

Map


涉及到键值对的概念
通过key来找到value
key不能重复

import java.util.HashMap;
import java.util.Map;

public class Test2 {
    public static void main(String[] args) {
        Map<String,String> map = new HashMap<>();
        //使用put插入键值对
        map.put("及时雨","宋江");
        map.put("花和尚","鲁智深");
        map.put("行者","武松");
        map.put("行者","武二郎");
        map.put("鲁智深","花和尚");
        System.out.println(map.isEmpty());
        System.out.println(map.size());

        //使用get根据key查找value
        String value = map.get("及时雨");d	
        //Map 根据key找到value
        //get方法如果key不存在,返回null
        //getOrDefault表示key如果不存在就返回默认值
        System.out.println(map.getOrDefault("小李广","花容"));
        System.out.println(map.get("行者"));
    }
}


遍历Map,打印所有的键值对(相对低效)

import java.util.HashMap;
import java.util.Map;

public class Test2 {
    public static void main(String[] args) {
        Map<String,String> map = new HashMap<>();
        //使用put插入键值对
        map.put("及时雨","宋江");
        map.put("花和尚","鲁智深");
        map.put("行者","武松");
        map.put("行者","武二郎");
        map.put("鲁智深","花和尚");

        //获得到一个条目的集合,每个entry就是一个键值对
        for(HashMap.Entry<String,String> entry : map.entrySet()){
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}

false
4
鲁智深: 花和尚
行者: 武二郎
花和尚: 鲁智深
及时雨: 宋江

判断

		System.out.println(map.containsKey("行者"));//高效的操作
        System.out.println(map.containsValue("鲁智深"));//比较低效(遍历)

相对低效

public class Test11_18 {
    public static void main(String[] args) {
        Map<String,String> map = new HashMap<>();
        map.put("及时雨","宋江");
        map.put("黑旋风","李逵");
        map.put("小李广","花荣");
        //4打印所有的key
        for(String key : map.keySet()){
            System.out.println(key);
        }
    }
}

黑旋风
小李广
及时雨
//我们发现顺序好像和插入的顺序不一样,

TreeMap:底层是二叉搜索树,会按照key的大小关系来排序
HashMap:底层是哈希表,顺序是不确定的,取决于具体key的hash函数的实现


//相对低效
public class Test11_18 {
    public static void main(String[] args) {
        Map<String,String> map = new HashMap<>();
        map.put("及时雨","宋江");
        map.put("黑旋风","李逵");
        map.put("小李广","花荣");
        //打印所有的value
        for (String value : map.values()){
            System.out.println(value);
        }
    }
}

李逵
花荣
宋江


Set

针对Set的核心操作是判断key是否存在(数学上的集合)

	Set<String> set = new HashSet<>();
        //插入若干元素
        set.add("C++");
        set.add("Java");
        set.add("Python");
        set.add("PHP");
        System.out.println(set.contains("C"));//效率高

false


迭代器进行遍历
迭代器是一种通用遍历集合类的方法。
Iterator是一个特殊的类,表示迭代器
Iterable是一个接口,表示可迭代的
必须要针对一个可迭代的对象(实现了Iterable接口的对象)才能使用迭代器来遍历
可迭代对象才能用for each

		Iterator<String> it = set.iterator();//得到一个迭代器对象
        while (it.hasNext()){
            System.out.println(it.next());
        }

Java
C++
PHP

### C++ STL `map` `set` 的常用操作及用法 #### 1. `set` 的常用操作 `set` 是一个有序集合,不允许重复元素。以下是其常见的操作示例代码: - **插入元素**:使用 `insert()` 方法插入元素。 - **删除元素**:使用 `erase()` 方法删除指定元素。 - **查找元素**:使用 `find()` 方法查找元素,返回指向元素的迭代器或 `end()`。 - **遍历集合**:通过迭代器或范围循环遍历集合中的所有元素。 ```cpp #include <set> #include <iostream> int main() { std::set<int> s; s.insert(3); // 插入元素 s.insert(1); s.insert(2); s.erase(2); // 删除元素 if (s.find(1) != s.end()) { // 查找元素 std::cout << "Element 1 found\n"; } for (const auto& e : s) { // 遍历集合 std::cout << e << " "; } return 0; } ``` 上述代码展示了如何插入、删除、查找以及遍历 `set` 中的元素[^1]。 --- #### 2. `map` 的常用操作 `map` 是一个有序映射,键值对 `<key, value>` 唯一。以下是其常见的操作示例代码: - **插入元素**:使用 `operator[]` 或 `insert()` 方法插入键值对。 - **删除元素**:使用 `erase()` 方法删除指定键值对。 - **查找元素**:使用 `find()` 方法查找键值对,返回指向键值对的迭代器或 `end()`。 - **访问值**:通过 `operator[]` 访问特定键对应的值。 - **遍历映射**:通过迭代器或范围循环遍历映射中的所有键值对。 ```cpp #include <map> #include <iostream> int main() { std::map<int, std::string> m; m[1] = "one"; // 使用 operator[] 插入键值对 m[2] = "two"; m.insert({3, "three"}); // 使用 insert() 插入键值对 m.erase(2); // 删除键值对 if (m.find(1) != m.end()) { // 查找键值对 std::cout << "Key 1 found: " << m[1] << "\n"; } for (const auto& [key, value] : m) { // 遍历映射 std::cout << key << ": " << value << "\n"; } return 0; } ``` 上述代码展示了如何插入、删除、查找以及遍历 `map` 中的键值对[^1]。 --- #### 3. `multiset` `multimap` 的操作 `multiset` `multimap` 的操作与 `set` `map` 类似,但它们允许重复元素或重复键值对。 - **`multiset` 示例**: ```cpp #include <set> #include <iostream> void testMultiset() { int array[] = {2, 1, 3, 9, 6, 0, 5, 8, 4, 2, 1, 3, 3, 3, 7}; std::multiset<int> s(array, array + sizeof(array) / sizeof(array[0])); for (const auto& e : s) { // 遍历 multiset std::cout << e << " "; } } int main() { testMultiset(); return 0; } ``` - **`multimap` 示例**: ```cpp #include <map> #include <iostream> int main() { std::multimap<int, std::string> mm; mm.insert({1, "one"}); mm.insert({1, "uno"}); for (const auto& [key, value] : mm) { // 遍历 multimap std::cout << key << ": " << value << "\n"; } return 0; } ``` 上述代码展示了 `multiset` `multimap` 的基本操作[^2]。 --- #### 4. 典型应用场景 - **`set` `multiset`**:适用于需要维护唯一性或允许重复的有序集合场景,例如去重、排序等。 - **`map` `multimap`**:适用于需要维护键值对关系的场景,例如字典查找、配置管理等。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值