亲历迅雷面试

昨天是情人节,到迅雷网络去面试。我学的是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,不然真不知道怎么做了。最后只好用 记事本 敲,敲了我三小时啊,最后居然说技术员在开会,不能给我检查,让我想回去等消息。郁闷~~~~

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值