URL编码(LintCode刷题)
原题目如下
给出一个代表网址 host 的字符串 base_url,和代表查询参数的数组 query_params,你需要返回带查询参数的完整 URL。
查询参数由一些包含两个元素的数组组成,第一个元素代表参数,第二个元素代表该参数对应的值。
现在需要你拼接两个部分得到完整的 URL。base_url 和查询参数字符串之间使用 ? 拼接,在查询参数的参数和值之间通过 = 拼接,各个查询参数之间使用 & 拼接。查询参数需要根据字典序排序。
代表查询参数的数组 query_params 长度在 100100 以内。数据中不会包含特殊的需要转义的字符。
样例 1:
输入:
"https://www.lintcode.com/problem"
[["typeId","2"]]
- 1
- 2
输出:
"https://www.lintcode.com/problem?typeId=2"
- 1
样例 2:
输入:
"https://translate.google.cn/"
[["sl","en"],["tl","zh-CN"],["text","Hello"],["op","translate
- 1
- 2
"https://translate.google.cn/?op=translate&sl=en&text=Hello&tl=zh-CN"
- 1
解释:
参数需要按照字典序拼接,所以需要先拼接 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();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
说明。该种方法采用了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);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
该解法主要关键点
//调用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));
}
});
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
文章来源: daodaozi.blog.csdn.net,作者:兰舟千帆,版权归原作者所有,如需转载,请联系作者。
原文链接:daodaozi.blog.csdn.net/article/details/122805738
- 点赞
- 收藏
- 关注作者
评论(0)