java的常见数据处理和数据结构理解
数据集合
Set
虽然 TreeMap 和TreeSet 实现的接口规范不同,但 TreeSet 底层是通过 TreeMap 来实现的(如同HashSet底层是是通过HashMap来实现的一样,HashSet是根据HashMap的key存值,所以不能有相同值),因此二者的实现方式完全一样。而 TreeMap 的实现就是红黑树算法。
都是非同步集合,因此他们不能在多线程之间共享,不过可以使用方法Collections.synchroinzedMap()来实现同步
HashSet这是根据hashmap的key值存取元素
Lambada的应用
去重
List<TeacherClass>ones=teacherClasses.stream().collect( Collectors.collectingAndThen(Collectors.toCollection(()->new TreeSet<>(Comparator.comparing(z->z.getUser().getUserName()+z.getYear().getId()))),ArrayList::new));
TeacherClass实体类根据z.getUser().getUserName() z.getYear().getId() 去重
排序
List<Strudent> tempSts=sts.stream().sorted(Comparator.comparing(student::getCode).reversed()).collect(Collectors.toList());
根据屬性取值
List<School> scs = list.stream().map(p -> p.getSchool()).collect(Collectors.toList());是一个list 使用School型集合
分组
partitioningBy和groupingBy 返回值都是Map,不过partitioningBy 的key是boolean
区间分组统计
* 区间统计
* @author chenqiao
*
*/
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
int numbers = 10;// 集合里数字的个数
int space = 10;// 区间的间隔
// 给集合里添加数字
Random rd = new Random();
for (int i = 0; i < numbers; i++) {
list.add(rd.nextInt(100)); // 集合里每个数字的范围是0~4999
}
funStream(list, space);
}
static void sortMap(Map<String, Long> param) {
TreeMap<String, Long> paramTreeMap = new TreeMap<>(param);
System.out.println(paramTreeMap);
}
private static void funStream(List<Integer> list, int space) {
// 使用流处理 把 数字分组
Map<String, Long> map = list.stream().collect(Collectors.groupingBy((num) -> {
return "区间:[" + num / space * space + "," + (num / space + 1) * space + ")";// 分组规则
},Collectors.counting()));
sortMap(map);
}
运行结果:
{区间:[0,10)=1, 区间:[20,30)=2, 区间:[40,50)=2, 区间:[70,80)=1, 区间:[80,90)=1, 区间:[90,100)=3}
使用map reduce计算分数在60分一下的分数总和
List<Student> studentList = InitData.getStudent();
Optional<Integer> score = studentList.stream()
.map(Student :: getScore)
.filter(s -> s>60)
.reduce((a,b) -> a+b); //没有60分以下的,以前不加判断就会出现空指针异常
System.out.println(score.orElse(0)); //0