android pair类用法,有序键值的一种:Pair

在某些情况下,既需要已键值的方式存储数据列表,还需要在输出的时候保持顺序。HashMap满足前者,ArrayList则满足后者,再不打算去多做修改且数据类型相对简单时,可以选择Android提供的一种工具类:Pair(搭配ArrayList)。

1. Pair 实例

Pair生成实例的方式有两种:

Pair pair = new Pair(1, "3");

or

Pair pair = Pair.create("1", 3);

实际上方式二在内部的实现只是对方式一的调用:

public static Pair create(A a, B b) {

return new Pair(a, b);

}

同时可以看出,Pair接收的数据类型是两个泛型,因此可以传入自定义的实体类。

2. 如何取值

Pair内部数据的存储如下:

public class Pair {

public final F first;

public final S second;

...

}

仅仅使用了两个public的变量,因此在取值时可以直接取用。

int key = pair.first;

String value = pair.second;

3. 关于比较

无论是ArrayList还是HashMap,凡是列表都会涉及到比较某元素是否已存在的情况。而Pair在内部实现equals方式是通过两个值的比较结果得出结果,这里涉及到一个问题:android.util.Pair与android.support.v4.util.Pair。

v4的Pair与常规Pair间的区别只在比较处,查看源码如下:

android.util.Pair

@Override

public boolean equals(Object o) {

if (!(o instanceof Pair)) {

return false;

}

Pair, ?> p = (Pair, ?>) o;

return Objects.equals(p.first, first) && Objects.equals(p.second, second);

}

android.support.v4.Pair

@Override

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));

}

唯一不同的是调用最终的比较方法,v4采用自己写的一个方法,而常规Pair则使用Objects类的equals方法,而Objects的equals方法实际上内部就是v4的objectsEqual使用的逻辑,那么为什么会有这个差别呢?

Objects这个类是Java7才有的类,而Android是从4.4KitKat开始支持JDK7编译,因此为了保证4.4之前的版本不会有空指针问题(4.4前的常规Pair),在v4中加入了一个不依赖JDK7的独立类。

关于Pair这个类,相对简单,却也恰到好处。

在C++中,`std::list` 是一个双向链表容器,`std::pair` 是一个模板,可以存储一对值。为了实现一个顺序键值对容器,我们可以使用 `std::list<std::pair<Key, Value>>`。以下是实现 `insert`, `find`, `erase` 方法的示例代码: ```cpp #include <iostream> #include <list> #include <utility> template <typename Key, typename Value> class OrderedMap { private: std::list<std::pair<Key, Value>> container; public: // 插入键值对 void insert(const Key& key, const Value& value) { // 检查键是否已经存在 for (auto& pair : container) { if (pair.first == key) { pair.second = value; // 更新值 return; } } // 如果键不存在,则插入新的键值对 container.push_back(std::make_pair(key, value)); } // 查找键对应的值 Value* find(const Key& key) { for (auto& pair : container) { if (pair.first == key) { return &(pair.second); } } return nullptr; // 如果未找到,则返回nullptr } // 根据键删除键值对 void erase(const Key& key) { for (auto it = container.begin(); it != container.end(); ++it) { if (it->first == key) { container.erase(it); return; } } } // 打印所有键值对 void print() const { for (const auto& pair : container) { std::cout << pair.first << ": " << pair.second << std::endl; } } }; int main() { OrderedMap<int, std::string> map; map.insert(1, "One"); map.insert(2, "Two"); map.insert(3, "Three"); map.print(); map.insert(2, "Dos"); // 更新键为2的值 map.print(); auto value = map.find(2); if (value) { std::cout << "Found: " << *value << std::endl; } else { std::cout << "Not found" << std::endl; } map.erase(2); map.print(); return 0; } ``` ### 代码说明 1. **`insert` 方法**:检查键是否已经存在,如果存在则更新值;否则插入新的键值对。 2. **`find` 方法**:查找键对应的值,如果找到则返回指向值的指针,否则返回 `nullptr`。 3. **`erase` 方法**:根据键删除键值对。 4. **`print` 方法**:打印所有键值对。 ### 运行结果 ``` 1: One 2: Two 3: Three 1: One 2: Dos 3: Three Found: Dos 1: One 3: Three ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值