Android 表示一对“组元素”的Pair类

本文深入解析了Pair容器的特性和用途,介绍了Pair的基本概念,包括其轻便的数据传递功能和值比较的equals方法。同时,文章提供了实例化Pair的多种方式,并通过代码示例展示了Pair在实际应用中的使用技巧,如如何利用Pair与List结合,达到类似Map的效果。

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

一、Pair初认识

打开词典,输入Pair,我们会得到这样的解释

Paste_Image.png

解释是:一副, 一条, 一把; 一双, 一对。
噢噢,成双成对罗。
什么,你看到的解释的是最后一行?罢了罢了,开始吧。

还是先看一下官网怎么说吧

Paste_Image.png

1、API 5 就有了,老兵啊
2、Pair<F,S>,成双成对罗。

严肃的说,就是:
Pair是一个容器,作用是轻便地对两个对象组成的元素组进行传递。这个对象提供了一个合理的equals()方法,如果两个对象的first和second值相等则返回true。

二、认识API

  • 1、Pair(F first, S second),一个Pair容器里面有2个元素,他们成组存在。
  • 2、Pair里面两个元素都是final的
  • 3、Pair的equals是值比较,不是地址比较

实例化方式

        Pair p1 = new Pair(18,"张三"); // 通过 构造函数 实例化对象
        Pair p2 = Pair.create(20, "李四");//通过 create方法以泛型的方式 实例化对象

Pair的equals

先看Pair自己的equals源码

        //android.util下的Pair equals
        public boolean equals (Object o){
            if (!(o instanceof Pair)) {
                return false;
            }
            Pair<?, ?> p = (Pair<?, ?>) o;
            return Objects.equal(p.first, first) && Objects.equal(p.second, second);
        }

        //这个是android.support.v4.util下的Pair equals
        public boolean equals (Object o){
            if (!(o instanceof Pair)) {
                return false;
            }
            Pair<?, ?> p = (Pair<?, ?>) o;
            return objectsEqual(p.first, first) && objectsEqual(p.second, second);
        }

        private static boolean objectsEqual (Object a, Object b){
            return a == b || (a != null && a.equals(b));
        }

无疑值比较。

实践代码

        String PAIR = "PAIR";

        Pair p1 = new Pair(18, "张三"); // 通过 构造函数 实例化对象
        Pair p2 = Pair.create(20, "李四");//通过 create方法 实例化对象
        Pair p3 = new Pair(18, "张三"); // 通过 构造函数 实例化对象

        boolean e1 = p1.equals(p2);
        Log.d(PAIR, "RESULT: " + e1); // false
        // Pair的 equals 不是地址比较

        boolean e2 = p1.equals(p3);
        Log.d(PAIR, "RESULT: " + e2);  //true
        // Pair的 equals 是值比较,而不是地址比较,当且仅当元素值一致时返回true

        boolean e3 = p1.equals("18");
        Log.d(PAIR, "RESULT: " + e3); // false

        boolean e4 = p1.equals(18);
        Log.d(PAIR, "RESULT: " + e4); // false

输出:

04-21 11:20:39.161 25404-25404/? D/PAIR: RESULT: false
04-21 11:20:39.161 25404-25404/? D/PAIR: RESULT: true
04-21 11:20:39.161 25404-25404/? D/PAIR: RESULT: false
04-21 11:20:39.161 25404-25404/? D/PAIR: RESULT: false

取值

  • 通过 对象.first 取出该组的第一个元素值
  • 通过 对象.second 取出该组的第一个元素值
        String PAIR = "PAIR";

        Pair p1 = new Pair(18, "张三"); // 通过 构造函数 实例化对象
        Log.d(PAIR, "取 first 数据: " + p1.first + "   " + p1.first.getClass()); // 取出
        Log.d(PAIR, "取 second 数据: " + p1.second + "   " + p1.second.getClass()); // 取出

.
.
输出:

04-21 11:24:12.583 27027-27027/? D/PAIR: 取 first 数据: 18   class java.lang.Integer
04-21 11:24:12.583 27027-27027/? D/PAIR: 取 second 数据: 张三   class java.lang.String
注意:Pair存储的“对元素”都是final,一旦复制,值不可改变,所以初始化一次赋值,不可修改。

关于API的部分就说到这里,因为实在简单,没有其他的特殊的了。有兴趣可以查看官方文档

三、Pair 有什么用

那问题就来了,Pair有什么用呢?

特性上面已经说了,Pair就是一组元素,他们是成对存在,你可能会想那不就是键值对吗,key和value吗?
有点类似,但是他们不一样,键值对的有一个关键的key让我们完成比较和取value等一系列操作。
但是Pair不一样,它就几乎只有3个方法,1个equals,一个取first值,一个取second。
道理摆在这里,具体怎么用,就看我们自己发挥了。

例子

比如我们知道,List和Map这两个集合容器是有很大不同的,但是如果在某些情况下,我们想用到List有的但是map没有的特性,但是我们数据又有一定关联成对出现或者说需要捆绑,那么我们是不是利用一下Pair呢?

再具体一点,比如我们现在在做一个IM软件,就以微信而言吧,会话列表肯定是根据最近联系人排序的,然后这是我们想用List实现,那么是不是可以这样创建一个List

List<Pair<Long, MyConversation>> sortList = new ArrayList<Pair<Long, MyConversation>>();

像这样,first我们存储时间戳,second我们存储比如名为MyConversation这个实体,那我们是不是就可以在得到数据后利用first进行排序了呢,肯定可以的。

当然了,你要是说我可以在MyConversation添加一个时间戳的字段的,那这样没办法好好聊天了,我们这里是为了示例,而且如果用Pair还可以省去实体的一个字段,避免打破原有结构。

用处

个人认为有以下情况:

  • 1、利用Pair和既有数据组成 组元素,不破坏原有结构的同时让两个数据产生绑定关系。
  • 2、利用Pair和List结合,形成类似Map的效果。



作者:阿敏其人
链接:https://www.jianshu.com/p/cbec7786d8f1
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

<think>好的,我现在需要回答用户关于如何在C++中从pair和tuple中获取元素的问题。首先,我需要理清pair和tuple的区别。用户提到的是“pair三元”,这可能是个误解,因为pair是二元,而tuple可以支持三元或更多元素。根据提供的引用[^1]和[^2],pair存放两个元素,tuple可以存放三个或更多,比如引用[^1]中的例子是std::tuple<int, float, char>。所以,用户可能混淆了pair和tuple,需要明确区分两者。 接下来,针对pair,用户想知道如何获取元素。根据引用中的示例,pair使用first和second成员变量来访问元素。例如,mypair.first和mypair.second。需要明确说明这一点,并给出代码示例。 对于tuple的情况,用户提到的是三元,所以应该使用tuple而不是pair。这里需要解释tuple的访问方式。C++中可以使用std::get<index>(tuple_obj)来获取特定位置的元素,或者使用结构化绑定(C++17及以上)。例如,引用中的std::tie可能是一个例子,但用户可能需要更直接的访问方法。需要说明这两种方法,并指出结构化绑定需要C++17支持,可能引用到引用[^3]提到的C++17环境。 另外,用户的问题中提到“三元”,可能需要特别强调tuple的三个元素如何访问,比如索引0、1、2。同时,注意型安全,例如std::get<0>(mytuple)会返回第一个元素型。 可能还需要比较pair和tuple的不同应用场景,比如pair用于两个元素,tuple用于更多元素,如引用中提到的函数多返回值。此外,引用[^4]提到数据结构的选择,这里虽然主要讨论哈希表和map,但可以侧面强调正确选择数据结构(如tuple)的重要性。 现在需要织这些信息,分步骤说明pair和tuple的元素访问方法,并提供代码示例。同时,注意用户可能存在的混淆,明确指出三元应使用tuple,而pair是二元。最后生成相关问题,引导用户进一步学习。</think>在C++中,`std::pair`和`std::tuple`是两种不同的容器型,获取元素的方式有显著差异。以下是具体方法: --- ### 一、std::pair(二元)的元素访问 `std::pair`用于存储两个不同型的元素,通过成员变量直接访问: ```cpp #include <utility> std::pair<int, std::string> mypair = std::make_pair(10, "hello"); int num = mypair.first; // 获取第一个元素(int型) std::string str = mypair.second; // 获取第二个元素(string型) ``` --- ### 二、std::tuple(三元或多元)的元素访问 `std::tuple`可存储三个及以上元素,需通过以下方式访问: #### 1. 使用`std::get<index>` ```cpp #include <tuple> std::tuple<int, float, char> mytuple = std::make_tuple(10, 2.6f, 'a'); int a = std::get<0>(mytuple); // 获取第一个元素(int) float b = std::get<1>(mytuple); // 获取第二个元素(float) char c = std::get<2>(mytuple); // 获取第三个元素(char) ``` #### 2. 结构化绑定(C++17及以上) ```cpp auto [x, y, z] = mytuple; // 自动解包元素到变量x, y, z ``` #### 3. 使用`std::tie`(选择性获取) ```cpp int x; char z; std::tie(std::ignore, std::ignore, z) = mytuple; // 仅获取第三个元素 ``` --- ### 三、关键区别 - **元素数量**:`pair`固定存储两个元素,`tuple`支持任意数量。 - **访问方式**:`pair`用`first/second`,`tuple`用索引或结构化绑定。 - **型安全**:`std::get<index>`会检查型和索引的有效性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值