今天在面试中遇到一个将字符串数组或list进行分类的面试问题,在此记录,以供学习和参考。
问题:
将List<String>中的字符串按长度进行分类,并按长度大小进行输出 。
分析:
1. 实现分类考虑使用K-V结构 ;
2. 使用hashmap或treemap进行键-值对应,但考虑键-值 有可能是一对多的关系所以使用map<Integer,List<String>> 结构;
3. 鉴于要求中输出长度要进行排序,最终选用treemap<Integer,List<String>> ;
解决:
1. 初始化list,如:
List<String>arrlist = Arrays.asList("my","name","is","cmc") ;
或
List<String>arrlist = new ArrayList<>() ;
arrlist.add("my") ;
arrlist.add("name") ;
arrlist.add("is") ;
arrlist.add("cmc") ;
arrlist.add("coder") ;
2. 初始化map用于存放按字符串长度分类的String结果
Map<Integer,List<String>> map = new TreeMap<>() ;
3. 遍历List进行分类操作
for(int i=0 ; i<arrlist.size() ; i++){
String str = arrlist.get(i) ;
int key = str.length() ;//设置字符串的长度为键
if(map.containsKey(str.length())){ //如果已有键key,则获取list并往里加入str元素
List<String> list = map.get(key) ;
list.add(str) ;
}else{
List<String> list = new ArrayList<>() ; //如果没有键key,则新建该长度的list并添加str元素
list.add(str) ;
map.put(key,list) ;
}
}
4. 使用遍历器Iterator遍历map输出结果即可
Iterator<Integer> it = map.keySet().iterator() ;
while(it.hasNext()){
int rkey = it.next() ;
List<String>rlist = map.get(rkey) ;
System.out.println("长度为"+rkey+"的字符串有:") ;
for(int j=0 ; j<rlist.size() ; j++){
System.out.println(rlist.get(j));
}
}
输出结果:
长度为2的字符串有:
my
is
长度为3的字符串有:
cmc
长度为4的字符串有:
name