1.在杭州梦想小镇一处面试地点,做互联网开发,给政府做项目的新型公司
问题(1)在一个List中有非常多的数据,也有非常多重复的数据,现在想将这个List中重复的数据清除,只留下单个唯一数据。
小编的回答1(想了一会):先将这个List循环放在一个Object[]数组中以,分开,然后全部toString()为一个String[]数组(有一点浪费内存,如果这个List非常大的话),然后通过Arrays.sort()方法排序,再通过Regex正则表达式将排序后的重复的数进行替换为单一的数,完成。大致代码如下:
Object[] obj = sSorted.toArray(new Object[sSorted.size()]);
//将Obj类型toString为字符类型
String[] str = new String[obj.length];
for (int i = 0; i < obj.length; i++) {
str[i] = obj[i].toString();
}
//对这个String数组排序
Arrays.sort(str);
//转换为String字符串
String mess = Arrays.toString(str);
//通过正则表达式剔除重复字符
mess = mess.replaceAll("([\\u4E00-\\u9FA5a-zA-Z\\d.]*,\\s)\\1+", "$1");
//转换回String数组
String[] list = mess.split(",");
面试官说了一些这个方法的不好点,如内存消耗大,逻辑代码过长,而且List中有各种类型的数据,你能保证转换为String后没有问题吗,并且正则表达式不是只能对单个字符进行判断什么的,反正就是不太好,他让我想想还有没有更简单的方法。
我想这个方法确实执行非常麻烦,正则表达式编写复杂,而且消耗也很大。而且bug也很多,最后一位不能得到判断
小编的回答2(想了一会,面试脑子一片空白,平时也没有做过此类题目,下面是面试后小编的答案):将原来的一个List赋值于新的List,双层for循环判断list.get(i).equals(list.get(j)) && i != j 如果这个条件成立遍删除集合中这个j的值,因为equals判断,所以如果出现“12”,12,12F,12D等相同值类型不同值也都不会被替换的,下面是小编的代码:
List list = lists;
for (int i = 0; i < list.size(); i++) {
for (int j = 0; j < list.size(); j++) {
if (list.get(i).equals(list.get(j)) && i != j) { //&& i !=j 避免是同一个值
lists.remove(j); //这里是lists
}
}
}
这个就简介多了,但是面试官给的答案更简单:
Set<String> set = new HashSet<>();
set.addAll(list);
就两行代码,声明一个set集合,使用set集合不存储重复值的原理一个个添加List集合中的值,这样就过滤了重复的值了
我当时是怎么都想不到这个解决方法,惭愧惭愧
后来小编在网上搜索了一下,既然还有跟简单的方法,只要一行代码,并且直接输出这个集合了。这个方法使用了java8的新特性,Stream流的概念。
System.out.println(lists.stream().distinct().collect(Collectors.toList()));
--------------------------------------------------------
2.这个是网上看到的一个题目,想编写下来做为参考
以下有一个 static method,类外会调用它,一个个地插入一些元素进入一个List。可以改变这个List内容的,只有这一个method,要求任何时候这个List都是有序的。比如,依次插入3、2、1、2,我希望List的顺序是1、2、2、3。
class Solution {
private static List<Integer> sSorted = new LinkedList<>();
public static void addElement(int e) {
// TODO: Insert e to sSorted and make sure sSorted is always sorted.
}
}
https://mp.weixin.qq.com/s/H9I2p9UBjvrS3MQQcBbz0w文章原地址:如果感兴趣可以看看,不要着急看答案:
如果做好的朋友可以点击下方按钮查看答案