亲历迅雷面试

昨天是情人节,到迅雷网络去面试。我学的是Android,她给了份C的题目,C早还给老师了,郁闷,走人。

后来,他们的人事让我回去,又做了份java的题目,自我感觉还行。哈哈,其实还有很多不会的空着。

下午有做上机题:编写一段程序,解析Url。

Url的格式如下:schema + "://" + authority + host + port + fullpath

其中authority、port、fullpath这3个项都是可以省略的,在Url中可以全部出现,也可以出现一部分或全部不出现。

schema为英文字母,如http、ftp、mms等。

authority格式:

user + " :" + password + "@"

或 user +"@"

或 ":" + "@"

或 ":" +password+"@"

或 "@"

host为英文字母和10个数字组成的串

port格式:

:+数字串

fullpath格式和unix下的全路径格式一样,如/user/1.txt , /2.txt;

现有一文件1.txt,每行都是一个url串,请编写程序把1.txt里的url串解析出来

放在2.txt里,每行都是一个url的解析结果,每行6列,分别是schema、user、password、host、port、fullpath

项的值,要求排列整齐。如果相应的项没有值,用串"default"代替。

类一:ReaderTxt

package com.xunlei; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; public class ReaderTxt { public static void main(String[] args) { // 定义输入输出流 BufferedReader br = null; PrintWriter out = null; String shcema; String username; String psw; String host; String port; String fullpath; try { // 文件1.txt和2.txt File file1 = new File("D:/1.txt"); File file2 = new File("D:/2.txt"); // 如果文件1.txt不存在,则退出 if (!file1.exists()) { System.out.println("解析文件地址有误,退出系统。"); return; } // 2.txt不存在,则创建 if (!file2.exists()) { file2.createNewFile(); } br = new BufferedReader(new InputStreamReader(new FileInputStream(file1))); out = new PrintWriter(new FileOutputStream(file2)); // 定义每读一行的url String url; while ((url = br.readLine()) != null) { // 调用方法解析 shcema = ParseUrl.parseShcema(url); username = ParseUrl.parseUser(url); psw = ParseUrl.parsePsw(url); host = ParseUrl.parseHost(url); port = ParseUrl.parsePort(url); fullpath = ParseUrl.parseFullPath(url); // 写入文件2.txt out.write(shcema + "\t"); out.write(username + "\t"); out.write(psw + "\t"); out.write(host + "\t"); out.write(port + "\t"); out.write(fullpath + "\r\n"); out.flush(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (br != null) { try { br.close(); } catch (Exception e) {} } if (out != null) { try { out.close(); } catch (Exception e) {} } } } }

类二:解析ParseUrl

package com.xunlei; public class ParseUrl { /** * 获取url的协议头Shcema * * @param url * @return */ public static String parseShcema(String url) { String urlShcema; // 获取Shcema的值 int i = url.indexOf(':'); urlShcema = url.substring(0, i); // 返回urlShcema return urlShcema; } /** * 获取url中的用户名 * * @param url * @return */ public static String parseUser(String url) { // 只有当url含有@时,才有user if (url.contains("@")) { String urlUser; // 获取第一个/的位置 int i = url.indexOf('/'); int j = url.indexOf('@'); if (i + 2 < j) { String tempAuthority = url.substring(i + 2, j); if (tempAuthority.contains(":")) { int k = tempAuthority.indexOf(':'); urlUser = tempAuthority.substring(0, k); if (urlUser != null && !"".equals(urlUser)) { return urlUser; } } else { urlUser = tempAuthority; return urlUser; } } } return "default"; } /** * 获取url中的密码 */ public static String parsePsw(String url) { // 只有当url含有@时,才有password if (url.contains("@")) { String urlPsw; // 获取第一个/的位置 int i = url.indexOf('/'); int j = url.indexOf('@'); if (i + 2 < j) { String tempAuthority = url.substring(i + 2, j); // 密码只有在:的后面,没有:就没有密码 if (tempAuthority.contains(":")) { int k = tempAuthority.indexOf(':'); urlPsw = tempAuthority.substring(k + 1, tempAuthority.length()); if (urlPsw != null && !"".equals(urlPsw)) { return urlPsw; } } } } return "default"; } /** * 获取Host */ public static String parseHost(String url) { String urlHost; // 如果url中含有@ if (url.contains("@")) { String tempEndStr = url.substring(url.indexOf('@') + 1, url.length()); // 如果后面的字符串含有:,则表示带有port if (tempEndStr.contains(":")) { urlHost = tempEndStr.substring(0, tempEndStr.indexOf(':')); } else if (tempEndStr.contains("/")) { // 如果url不含port,含有/,则表示其后还有fullpath urlHost = tempEndStr.substring(0, tempEndStr.indexOf('/')); } else { urlHost = tempEndStr; } } else { // 如果url不含有authority项 String tempEndStr = url.substring(url.indexOf('/') + 2, url.length()); // 如果后面的字符串含有:,则表示带有port if (tempEndStr.contains(":")) { urlHost = tempEndStr.substring(0, tempEndStr.indexOf(':')); } else if (tempEndStr.contains("/")) { // 如果url不含port,含有/,则表示其后还有fullpath urlHost = tempEndStr.substring(0, tempEndStr.indexOf('/')); } else { urlHost = tempEndStr; } } return urlHost; } /** * 获取port */ public static String parsePort(String url) { String urlPort; if (url.contains("@")) { // 截取@后面的字符串 String tempEndStr = url.substring(url.indexOf('@') + 1, url.length()); if (tempEndStr.contains(":")) { String tempEndEndStr = tempEndStr.substring( tempEndStr.indexOf(':') + 1, tempEndStr.length()); if (tempEndEndStr.contains("/")) { urlPort = tempEndEndStr.substring(0, tempEndEndStr.indexOf('/')); if (urlPort != null && !"".equals(urlPort)) { return urlPort; } } else { urlPort = tempEndEndStr; if (urlPort != null && !"".equals(urlPort)) { return urlPort; } } } } else { // 截取/后面的字符串 String tempEndStr = url.substring(url.indexOf('/') + 2, url.length()); if (tempEndStr.contains(":")) { String tempEndEndStr = tempEndStr.substring( tempEndStr.indexOf(':') + 1, tempEndStr.length()); if (tempEndEndStr.contains("/")) { urlPort = tempEndEndStr.substring(0, tempEndEndStr.indexOf('/')); if (urlPort != null && !"".equals(urlPort)) { return urlPort; } } else { urlPort = tempEndEndStr; if (urlPort != null && !"".equals(urlPort)) { return urlPort; } } } } return "default"; } /** * 获取fullpath */ public static String parseFullPath(String url) { String fullPath; if (url.lastIndexOf('/') != (url.indexOf('/') + 1)) { String tempStr = url.substring(url.indexOf('/') + 2, url.length()); fullPath = tempStr.substring(tempStr.indexOf('/'), tempStr.length()); if (fullPath != null && !"".equals(fullPath)) { return fullPath; } } return "default"; } }

PS:迅雷那些做题用的机器没有装Eclipse,5555555,只有MS.net用的工具,虽然也可以写java,但我不会用,郁闷ing。

幸好还有java的JDK,不然真不知道怎么做了。最后只好用 记事本 敲,敲了我三小时啊,最后居然说技术员在开会,不能给我检查,让我想回去等消息。郁闷~~~~

此题,求高手能给出更好更快的方法,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值