题目来源:Codingmae MIME Type
要求
- 通过文件名,输出对应的MIME类型
- 尽可能快地处理大量数据
思路
一开始想用正则表达式,通过遍历数组查找对应的MIME
,但通不过最后一个大量数据测试。那么只能用Map
来存储给出的MIME
类型,用StringBuffer
来存储找到的文件名后缀。
注意无后缀文件名
代码
在测试的时候很有趣,一次没通过,第二次同样的代码通过了。
public static void main(String args[]) {
Scanner in = new Scanner(System.in);
int N = in.nextInt(); // Number of elements which make up the association table.
int Q = in.nextInt(); // Number Q of file names to be analyzed.
Map<String,String> MIME = new HashMap<>();
for (int i = 0; i < N; i++) {
String EXT = in.next(); // file extension
String MT = in.next(); // MIME type.
MIME.put(EXT.toLowerCase(),MT);
}
//System.err.println(MIME);
in.nextLine();
//减少对象创建次数,所以它在循环外
StringBuffer buffer = new StringBuffer();
//获取后缀
for (int i = 0; i < Q; i++) {
String FNAME = in.nextLine().toLowerCase(); // One file name per line.
//System.err.println("输入:"+FNAME);
int j= FNAME.length()-1;
boolean point = false;
while (j>=0){
if (FNAME.charAt(j) != '.'){
buffer.append(FNAME.charAt(j));
}
else if (FNAME.charAt(j) == '.'){
point = true;
break;
}
j--;
}
//无后缀处理
if (!point){
System.out.println("UNKNOWN");
buffer.delete(0,buffer.length());
continue;
}
//有后缀处理
buffer.reverse();
//System.err.println(buffer);
Optional<String> optional = Optional.ofNullable(MIME.get(buffer.toString().strip()));
System.out.println(optional.orElse("UNKNOWN"));
buffer.delete(0,buffer.length());
}
}