原题目如下
给出一个代表网址 host 的字符串 base_url,和代表查询参数的数组 query_params,你需要返回带查询参数的完整 URL。
查询参数由一些包含两个元素的数组组成,第一个元素代表参数,第二个元素代表该参数对应的值。
现在需要你拼接两个部分得到完整的 URL。base_url 和查询参数字符串之间使用 ? 拼接,在查询参数的参数和值之间通过 = 拼接,各个查询参数之间使用 & 拼接。查询参数需要根据字典序排序。
代表查询参数的数组 query_params 长度在 100100 以内。数据中不会包含特殊的需要转义的字符。
样例 1:
输入:
"https://www.lintcode.com/problem" [["typeId","2"]]
输出:
"https://www.lintcode.com/problem?typeId=2"
样例 2:
输入:
"https://translate.google.cn/" [["sl","en"],["tl","zh-CN"],["text","Hello"],["op","translate
"https://translate.google.cn/?op=translate&sl=en&text=Hello&tl=zh-CN"
解释:
参数需要按照字典序拼接,所以需要先拼接 op 部分,然后是 sl 部分,接着是 text 部分,最后才是 tl 部分。
题目梳理
1:一个host字符串base_url
2:代表查询的参数的数组query_params
3:查询参数的组成包含两个参数,一个元素代表参数,第二个对应参数的值
4:查询参数是存放于数组中的数组(由样例可以看出)
5:拼接要求:base_url与后面的查询参数连接,中间连接符为?号,查询参数的参数和其对应的值用=连接。
6:多个查询参数按照&连接
7:查询参数根据字典序排序
8:注意点:需要考虑查询参数为空的情况
题解方法一:
import java.util.*; public class Solution { /** * @param base_url: the string of base_url * @param query_params: sequence of two-element tuples by query_params * @return: return a url query string */ public String urlencode(String base_url, List<List<String>> query_params) { // write your code. StringBuilder sb = new StringBuilder(); sb.append(base_url);//将base_url添加进来 if(query_params.size() != 0){ //查询参数没有的时候,是不需要添加问号的 sb.append("?"); } int count = 0; TreeMap<String,String> map = new TreeMap<>(); //使用到了TreeMap双列集合 for (int i = 0;i<query_params.size();i++){ map.put(query_params.get(i).get(0),query_params.get(i).get(1));//相当于获取对应的键值对,并添加进去 } for(Object o:map.keySet()){ ++ count; String temp = o + "=" + map.get(o); sb.append(temp); if(count < query_params.size()){ sb.append("&"); } } System.out.println(sb.toString()); return sb.toString(); } }
说明。该种方法采用了StringBuilder先去添加基本的host字符串。然后在Map集合中处理后续的查询参数。通过遍历查询参数进行将键值分别添加到map集合。然后处理查询参数和值之间进行=号连接,以及后续各个查询参数进行&号连接。处理好直接的关系。
题解二(官方题解)
public class Solution { /** * @param base_url: the string of base_url * @param query_params: sequence of two-element tuples by query_params * @return: return a url query string */ public String urlencode(String base_url, List<List<String>> query_params) { if (query_params == null || query_params.size() == 0) { return base_url; } Collections.sort(query_params, new Comparator<List<String>>() { @Override public int compare(List<String> o1, List<String> o2) { return o1.get(0).compareTo(o2.get(0)); } }); StringBuffer sb = new StringBuffer(base_url + "?"); for (int i = 0; i < query_params.size(); i++) { String key = query_params.get(i).get(0); String val = query_params.get(i).get(1); sb.append(key + "=" + val); if (i != query_params.size() - 1) { sb.append("&"); } } return String.valueOf(sb); } }
该解法主要关键点
//调用Collection.sort()方法。并重写了compare方法 Collections.sort(query_params, new Comparator<List<String>>() { @Override //重写了compare方法 public int compare(List<String> o1, List<String> o2) { return o1.get(0).compareTo(o2.get(0)); } });