ある企業のペーパーテストに出た問題。「入力された文字列のうち、1回しか登場しないもので最も左に出現する文字を出力するプログラムを書け」
before
私の回答 (クラス名が"Q2"なのは、問2だったから):
import java.map.*;
import java.list.*;
public class Q2 {
public static void main(String[] args) {
if(args.length != 1) System.err.println("Usage: java Q2 phrase");
String phrase = args[0];
Map<Character, Integer> chars = new LinkedHashMap<Character, Integer>();
for(char c : phrase.toCharArray()) {
chars.put(c, chars.get(c) == null ? 1 : chars.get(c)+1);
}
for(Map.Entry<Character, Integer> e : chars.entryList()) {
if(e.getValue() == 1) {
System.out.println(e.getKey());
exit;
}
}
}
}
問題点
- java.map.*とかjava.list.*なんてパッケージはない。java.util.*である。
- argsの長さが1のとき、警告を出すことはできるがそこで処理が終わらないので例外が出てしまう。System::exitを使う。
- Map#entryList()なるメソッドは存在しない。正しくはMap#entrySet()。
- ループから抜け出すのはexitでなくbreak。
after
ということで以下のようになった:
import java.util.*;
public class Q2 {
public static void main(String[] args) {
if(args.length != 1) {
System.err.println("Usage: java Q2 phrase");
System.exit(-1);
}
String phrase = args[0];
Map<Character, Integer> chars = new LinkedHashMap<Character, Integer>();
for(char c : phrase.toCharArray()) {
chars.put(c, chars.get(c) == null ? 1 : chars.get(c)+1);
}
for(Map.Entry<Character, Integer> e : chars.entrySet()) {
if(e.getValue() == 1) {
System.out.println(e.getKey());
break;
}
}
}
}
まあ1次選考は突破できたのでよかったが、みんなもIDEに頼りすぎるのはやめようね!