无非就是检查是否已经有数据的问题,用List做可能比较简单点
public class SigleList{List<Integer> nums
public SingleList(){
nums = new ArrayList<Integer>()
}
public void add(Integer num){
if(!checkNumExist){
nums.add(num)
}
}
public boolean checkNumExist(Integer){
return nums.contains(Integer)
}
}
这个SingleList就简单实现了去重增加,可以用它来读数据
public class Test{public static void main(String[] args){
SingleList nums = new SingleList()
// 产生100个数据
for(int i = 0 i++ i < 100){
// 产生随机数
Integer num = new Random().nextInt(100000)
nums.add(num)
}
foreach(Integer num : nums){
System.out.println(num)
}
}
}
这题考的是大数据去重,数据量大于内存,即无法直接在内存中去重,那么有两个方案:1、内存外去重
也就是将数据存入数据库,然后利用数据库进行排序并去重。
优缺点:
1)优点:简单直接
2)缺点:消耗大
2、算法去重
题目中说明是20G数据,假设每行数据是1k,则数据行数是20M(如果每行数据是512字节,则数据行数是40M),可使用MD5对每行数据进行映射,获得16字节映射吗,即总共需要内存空间320M(或640M),满足内存内去重的需求。
优缺点:
1)优点:在内存内进行处理,速度明显比内存为要快。
2)缺点:需要进行额外的编码,程序复杂度和效率要求较高。
List<String> list = new ArrayList<>()/*list.add("abc")
list.add("abc")
list.add("def")
list.add("bcd")*/
Set<String> set = new LinkedHashSet<>()//这种方式保证去重后的元素相对位置不变
//Set<String> set = new HashSet<>()//这种方式去重后元素的位置很有可能变化了
set.addAll(list)
list.clear()
list.addAll(set)
for(String s : list){
System.out.println(s)
}
整个思路就是利用set中的元素是不重复的,来达到去重的目的