大家好,我是小白学Java。
今天别人和我说了一个他朋友的面试题,我也实现了一下,在这里做一个记录。
题目:在一个大 list 中有重复字符串,如何能找到以某些特定字符开头的字符串,并统计重复次数,根据重复次数进行排序,获取前一百名信息。比如找到以 “S”开头的字符串,统计其出现的次数,并按出现的次数排序,输出前一百名的信息
实现代码如下:
@Test
public void test2(){
List<String> list = getStringList(100000);
String startChar = "S";
List<String> noSortedList = list.stream()
.filter(s -> s.startsWith(startChar))
.collect(Collectors.toList());
int sum = noSortedList.size();
List<Map.Entry<String,Long>> sortedList = noSortedList.stream()
.collect(Collectors.groupingBy(s -> {return s;},Collectors.counting()))
.entrySet().stream().sorted((a, b) ->{
return (int) (b.getValue() - a.getValue());
})
.limit(100)
.collect(Collectors.toList());
int size = sortedList.size();
System.out.println("以字母 " + startChar +" 开头的字符串总数是:" + sum + " ,统计前 " + sortedList.size() + " 个的出现次数排名");
System.out.println("排在第一位的是:" + sortedList.get(0).getKey() + " ,出现次数是:" + sortedList.get(0).getValue());
System.out.println("排在最后一位的是:" + sortedList.get(size - 1).getKey() + " ,出现次数是:" + sortedList.get(size - 1).getValue());
System.out.println("前 100 名的字符串和使用次数如下:");
sortedList.forEach(System.out::println);
}
/**
* 获取字符串集合
* @param count
* @return
*/
public List<String> getStringList(int count){
Random random = new Random();
List<String> list = Lists.newArrayList();
for(int i = 0; i < count; i++){
char c = (char) (random.nextInt(26) + 65);
String str = String.valueOf(c) + random.nextInt(100);
list.add(str);
}
return list;
}
输出结果:
....