Java编程语言,使用自定义二元组对象替代map集合实现Key-Value格式的数据存储

一、背景

url请求地址,后面使用&把多个请求参数拼接起来,例如:?p1=v1&p2=v2&p3=v3
它们的key分别是p1/p2/p3,对应的value分别是v1/v2/v3。

也许很多人都会通过map集合来存储,算比较通用的做法了:

Map<String, String> map = Maps.newHashMap();
map.put("p1","v1");
map.put("p2","v2");
map.put("p3","v3");

本文欲介绍另一种自定义的二元组对象,实现像map那样的key-value格式的数据存储。

在这里插入图片描述

二、二元组Tuple

   public class Tuple<T1, T2> {
        T1 _1;
        T2 _2;

        public Tuple(T1 _1, T2 _2) {
            this._1 = _1;
            this._2 = _2;
        }
    }

这里使用了泛型,如果你的是key和value都是string类型,那么Tuple<String, String> tuple = new Tulple<String, String> () ;

进一步说,如果你的value是Tuple二元组,那么Tuple<String, Tuple<String, String>> tuple = new Tuple<String, Tuple<String, String>> () ;

三、Query

  • 定义成员变量params,它是一个二元组列表,而且二元组本身是一个嵌套的二元组(它的value又是一个二元组)
  • mergeWith() 批量拼接参数
  • append(),新增参数至二元组列表里
  • appendIf(),把value强制转换为string类型
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
 
public class Query {

    private final List<Tuple<String, Tuple<String, String>>> params = new ArrayList<Tuple<String, Tuple<String, String>>>();

    public Query append(final String name, final String value) throws UnsupportedEncodingException {
        params.add(new Tuple<String, Tuple<String, String>>(name, new Tuple<String, String>(value, URLEncoder.encode(value, "UTF-8"))));
        return this;
    }

    public <T> Query appendIf(final String name, final T value) throws UnsupportedEncodingException {
        if (value != null) {
            append(name, value.toString());
        }
        return this;
    }


    public boolean mergeWith(Query query) {
        return params.addAll(query.params);
    }

    @Override
    public String toString() {
        // 略
    }
}

1、toString() 把二元组列表转换为String

把java对象转换为http请求参数列表。

    @Override
    public String toString() {
        final StringBuilder builder = new StringBuilder();

        for (final Tuple<String, Tuple<String, String>> param : params) {
            if (builder.length() == 0) {
                builder.append('?');
            } else {
                builder.append('&');
            }
            builder.append(param._1);
            builder.append('=');
            builder.append(param._2._2);
        }

        return builder.toString();
    }

2、测试

    @Test
    public void mixedStyle_append() throws UnsupportedEncodingException {
        Query query = new Query()
                .append("p1", "v1");

        query.append("p2", "v2");

        query = query.append("p3", "v3");

        assertEquals("?p1=v1&p2=v2&p3=v3", query.toString());
    }

四、总结

Java编程是强类型语言,且面向对象编程,我们一般都会定义类及对象,当发起http请求的时候,经常会需要转换对象。

本文提供了一种轻量级的Key-Value格式的数据存储,显然它没有Map集合那么重。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
A:以下是几种可能的方法: 1. 遍历较长的list<map>,对于每个map,逐一比较其它list<map>中是否存在相同的keyvalue。如果没有,则该keyvalue为不同的。时间复杂度为O(nk),其中n为list<map>的长度,k为最大的map的大小。 2. 对于较短的list<map>,将其转化为一个set,其中元素为(key, value)的元组,然后遍历较长的list<map>,对于其中每个(key, value)的元组,判断是否在set中。如果不存在,则该(key, value)为不同的。时间复杂度为O(nlogn),其中n为list<map>的长度。 3. 对于较短的list<map>,先遍历其中的所有map,将每个map中的所有元素插入到一个哈希表中(key-value对),然后遍历较长的list<map>,对于其中每个map,逐一查找哈希表中是否存在相同的keyvalue。如果没有,则该keyvalue为不同的。时间复杂度为O(kn),其中n为list<map>的长度,k为最大的map的大小。 4. 对于两个list<map>中的所有元素,可以使用Java 8中的Stream API进行处理,先将每个map中的所有元素转化为一个(key, value)的元组,然后使用Stream的filter()方法过滤出不同的元组。示例代码如下: ``` List<Map<String, String>> list1 = // 第一个list<map> List<Map<String, String>> list2 = // 第list<map> Set<Map.Entry<String, String>> set1 = list1.stream() .flatMap(map -> map.entrySet().stream()) .collect(Collectors.toSet()); Set<Map.Entry<String, String>> set2 = list2.stream() .flatMap(map -> map.entrySet().stream()) .collect(Collectors.toSet()); Set<Map.Entry<String, String>> diff = set1.stream() .filter(e -> !set2.contains(e)) .collect(Collectors.toSet()); ``` 其中,set1和set2分别为两个list<map>中的所有元素所构成的集合,而diff为不同的元素的集合。这种方法的时间复杂度为O(nk),其中n为list<map>的长度,k为最大的map的大小。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天草二十六_简村人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值