import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeMap;
public class Problem1002 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int numberOfTelenumber;
numberOfTelenumber = sc.nextInt();
Map<String, Integer> stringSet = new TreeMap();
for (int i = 0; i < numberOfTelenumber; i++) {
String input = getCorrespondNumber(sc.next());
if (stringSet.containsKey(input)) {
int count = stringSet.get(input);
stringSet.put(input, ++count);
} else {
stringSet.put(input, 1);
}
}
printResult(stringSet);
}
public static String getCorrespondNumber(String inputString) {
StringBuilder sc = new StringBuilder();
for (int m = 0; m < inputString.length(); m++)
if (inputString.charAt(m) != '-') {
switch (inputString.charAt(m)) {
case 'A':
case 'B':
case 'C':
sc.append('2');
break;
case 'D':
case 'E':
case 'F':
sc.append('3');
break;
case 'G':
case 'H':
case 'I':
sc.append('4');
break;
case 'J':
case 'K':
case 'L':
sc.append('5');
break;
case 'M':
case 'N':
case 'O':
sc.append('6');
break;
case 'P':
case 'S':
case 'R':
sc.append('7');
break;
case 'T':
case 'U':
case 'V':
sc.append('8');
break;
case 'W':
case 'X':
case 'Y':
sc.append('9');
break;
default:
sc.append(inputString.charAt(m));
}
}
sc.insert(3, '-');
return sc.toString();
}
public static void printResult(Map<String,Integer> mapSet) {
Set keys = mapSet.keySet();
Iterator keyIterator = keys.iterator();
boolean NOTFOUND=true;
while (keyIterator.hasNext()) {
String key = keyIterator.next().toString();
if (mapSet.get(key)>1){
System.out.println(key + " "
+ mapSet.get(key));
NOTFOUND=false;}
}
if(NOTFOUND){
System.out.println("No duplicates.");
}
}
}
最开始用了非常笨的办法,没有想到Map解决。
需要将一个对象映射到另一个对象,首先就应该想到Map。
JAVA中的几种常见Map实现的异同
HashMap 性能最优,特别插入和查询键值对的开销是固定的。
LinkedHashMap 类似于HashMap,迭代的速度更快,因为里面的顺序是由链表维持的。
TreeMap TreeMap所得到的结果是经过排序的,这也是为什么在这个程序里选择他。
WeakHashMap
ConcurrentHashMap 一种线程安全的Map。
IdentityHashMap 使用--代替equals,专门为特殊的需要设计。