对 Java 集合的巧妙利用
我们直接切入正题。首先大致介绍一下 Java 三大集合的一些特征:
①、ArrayList:底层采用数组结构,里面添加的元素有序可以重复。
②、HashSet:底层采用哈希表算法,里面添加的元素无序不可重复。
③、HashMap:底层也是采用哈希表算法,但是里面添加的元素是 key-value 的形式。key 不允许重复,value 可以。
那么我们在日常编程中就可以好好利用这些集合的原理,简化我们的编程思路。
一、如何统计一字符串中每个字符出现的次数?
解析:给定一串字符串,统计每个字符出现的次数。那么最后统计出来的格式应该如下:
a---num个
b---num个
...
j---num个等等
很明显,这种格式首先第一个统计的字符是不能重复的,而出现的个数我们可以不用管。那么很容易联想到 Map 的集合原理,key-value。我们将统计的字符放在 Map<Character,Integer>中是一种很好的实现方式。
public class CountCharTest {
public static Map<Character, Integer> countChar(Map<Character, Integer> map,String str){
//将所给的字符串解析为一个字符构造的数组
char[] chars = str.toCharArray();
for(char c : chars){
if(map.containsKey(c)){
int oldCount = map.get(c);
map.put(c, oldCount+1);
}else{
map.put(c, 1);
}
}
return map;
}
public static void main(String[] args) {
String str = "afoiasfoffqefljflsda";
//定义一个 Map 集合,用来存放统计的 字符--个数
Map<Character, Integer> hashMap = new HashMap<>();
System.out.println(countChar(hashMap,str));
//{f=6, d=1, e=1, s=2, q=1, a=3, o=2, l=2, j=1, i=1}
}
}
补充:这里我们用来保存统计字符的是 HashMap 的实现类,这里打印出来的字符统计是无序的。如果我们想根据字符串给定的顺序有序的统计出来,可以使 LinkedHashMap
public static void main(String[] args) {
String str = "afoiasfoffqefljflsda";
//定义一个 Map 集合,用来存放统计的 字符--个数
Map<Character, Integer> linkedHashMap = new LinkedHashMap<>();
System.out.println(countChar(linkedHashMap,str));
//{a=3, f=6, o=2, i=1, s=2, q=1, e=1, l=2, j=1, d=1}
}
如果想用 uicode 的编码顺序打印给定的字符串,那么我们使用 TreeMap
public static void main(String[] args) {
String str = "afoiasfoffqefljflsda";
//定义一个 Map 集合,用来存放统计的 字符--个数
Map<Character, Integer> treeMap = new TreeMap<>();
System.out.println(countChar(treeMap,str));
//{a=3, d=1, e=1, f=6, i=1, j=1, l=2, o=2, q=1, s=2}
}
二、给定一个数组,如何去掉重复的数据?
解析:这个联想到集合的特定,我们就很容易想到用 Set 集合来解决。将数组中的元素都放到Set,然后将 Set 集合转变为数组就可以了。
public class ClearRepeatTest {
public static Integer[] clearRepeat(int [] array){
Set<Integer> set = new HashSet<>();
for(int i : array){
set.add(i);
}
Integer[] newArray = set.toArray(new Integer[set.size()]);
return newArray;
}
public static void main(String[] args) {
//创建一个数组,可以看出 2和4 是重复的
int [] array = {1,2,3,4,8,2,5,4};
Integer[] newArray = clearRepeat(array);
for(Integer i : newArray){
System.out.println(i);
}
//1 2 3 4 5 8
}
}
补充:同理我们可以 改变 Set 集合的实现类,hashSet 是无序的,我们可以会用 LinkedHashSet 保证既定顺序;TreeSet 保证自然顺序
对 Java 集合的巧妙利用的更多相关文章
- 死磕 java集合之CopyOnWriteArraySet源码分析——内含巧妙设计
问题 (1)CopyOnWriteArraySet是用Map实现的吗? (2)CopyOnWriteArraySet是有序的吗? (3)CopyOnWriteArraySet是并发安全的吗? (4)C ...
- Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结
2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...
- Java集合(2)一 ArrayList 与 LinkList
目录 Java集合(1)一 集合框架 Java集合(2)一 ArrayList 与 LinkList Java集合(3)一 红黑树.TreeMap与TreeSet(上) Java集合(4)一 红黑树. ...
- Java集合分析
Java集合分析 前言 从开始接触Java的时候, 就在强调的一个重要版块, 集合. 终于能够开始对它的源码进行分析, 理解, 如果不懂得背后的思想, 那么读懂代码, 也仅仅是读懂了 if else ...
- java集合源码分析(六):HashMap
概述 HashMap 是 Map 接口下一个线程不安全的,基于哈希表的实现类.由于他解决哈希冲突的方式是分离链表法,也就是拉链法,因此他的数据结构是数组+链表,在 JDK8 以后,当哈希冲突严重时,H ...
- Java集合框架List,Map,Set等全面介绍
Java集合框架的基本接口/类层次结构: java.util.Collection [I]+--java.util.List [I] +--java.util.ArrayList [C] +- ...
- (转)Java集合框架:HashMap
来源:朱小厮 链接:http://blog.csdn.net/u013256816/article/details/50912762 Java集合框架概述 Java集合框架无论是在工作.学习.面试中都 ...
- Java提高篇(三五)-----Java集合细节(一):请为集合指定初始容量
集合是我们在Java编程中使用非常广泛的,它就像大海,海纳百川,像万能容器,盛装万物,而且这个大海,万能容器还可以无限变大(如果条件允许).当这个海.容器的量变得非常大的时候,它的初始容量就会显得很重 ...
- Java集合源码分析(二)ArrayList
ArrayList简介 ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存. ArrayList不是线程安全的,只能用在单线程环境下,多线 ...
随机推荐
- 将后面的m个数移到前面
#include<iostream> #include<algorithm> #include<stdio.h> #include<numeric> u ...
- 微信小程序爬坑日记
新公司上手小程序.30天,从入门到现在,还没放弃... 虽然小程序发布出来快一年了,爬坑的兄弟们大多把坑都踩平了.而我一直停留在"Hello World"的学习阶段.一来没项目,只 ...
- javascript设计模式——中介者模式
前面的话 程序由大大小小的单一对象组成,所有这些对象都按照某种关系和规则来通信.当程序的规模增大,对象会越来越多,它们之间的关系也越来越复杂,难免会形成网状的交叉引用.当改变或删除其中一个对象的时候, ...
- mybatis延迟加载一对多
1.实体类 package cn.bdqn.bean; import java.util.Set; /** *国家的实体类 */ public class Country { private Inte ...
- Win10系统下的Tomcat7.0配置
为什么不用更高版本的Tomcat呢?好几个老师都说7.0的版本最好用,所以就推荐用这个.安Tomcat之前,我电脑上装的是jdk 9,安装了好几次Apache都不能启动,日志显示的是"启动报 ...
- Springboot学习记录1--概念介绍以及环境搭建
摘要:springboot学习记录,环境搭建: 官方文档地址:https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/ht ...
- Model中内部类meta详解
Django 模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性. 以下对此作一总结: Model 元数据就是 "不是一个字段的任何数据" -- 比如排序选项 ...
- 用maven搭建java ee项目
一.开发环境 jdk1.7 tomcat7 eclipse-jee-luna-R-win32 maven2.2.1 二搭建步骤 1.点击File->New->Other,选择maven ...
- Android数据加密概述及多种加密方式 聊天记录及账户加密 提供高质量的数据保护
Android数据加密概述及多种加密方式 聊天记录及账户加密 提供高质量的数据保护 数据加密又称password学,它是一门历史悠久的技术,指通过加密算法和加密密钥将明文转变为密文.而解密则是通过解密 ...
- <转> Libvirt学习总结
感谢朋友支持本博客.欢迎共同探讨交流.因为能力和时间有限,错误之处在所难免,欢迎指正! 假设转载,请保留作者信息. 博客地址:http://blog.csdn.net/gaoxingnengjisua ...