对 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不是线程安全的,只能用在单线程环境下,多线 ...
随机推荐
- Libevent 事件循环(1)
// 事件的dispatch int event_base_loop(struct event_base *base, int flags) { //得到采用的事件模型 epoll/epoll/ ...
- 51Nod 1007 正整数分组 01背包
将一堆正整数分为2组,要求2组的和相差最小.例如:1 2 3 4 5,将1 2 4分为1组,3 5分为1组,两组和相差1,是所有方案中相差最少的.Input第1行:一个数N,N为正整数的数量.第2 - ...
- Scala入门系列(九):函数式编程
引言 Scala是一门既面向对象,又面向过程的语言,Scala的函数式编程,就是Scala面向过程最好的佐证.也真是因此让Scala具备了Java所不具备的更强大的功能和特性. 而之所以Scala一直 ...
- Windows下安装solr步骤详解
Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口.用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引:也可以通过Http Get操 ...
- 关于C语言中static保留字的使用
static存储类型可以用于全部变量,无需考虑变量声明的位置.但是作用于块外部和块内部时具有不同的作用. (1)当作用于函数内部时,和每次程序离开所在块就会丢失值的自 ...
- C语言写单链表的创建、释放、追加(即总是在最后的位置增加节点)
昨天周末给学妹讲了一些指针的知识,本来我对指针就是似懂非懂的状态,经过昨天一讲,我对指针的学习就更深刻了 果然给别人讲课也是学习的一个方法.加上最近复习数据结构,发现我的博客里没有链表的博文,所以趁这 ...
- Hadoop 少量map/reduce任务执行慢问题
最近在做报表统计,跑hadoop任务. 之前也跑过map/reduce但是数据量不大,遇到某些map/reduce执行时间特别长的问题. 执行时间长有几种可能性: 1. 单个map/reduce任务处 ...
- 机房收费系统——转换list泛型时,字段名称不正确应出现故障
因为之前对泛型研究了一番,所以就開始尝试着在机房收费系统重构中增加了泛型的使用. 可是到了做学生查看剩余金额这个功能的时候,还是依照之前的方法做的,可是在载入数据的时候班级这个框就没有显示出来--然后 ...
- HBase1.0.1基本操作(java代码)
public class HQuery { private static ConnHBase connHbase=new ConnHBase(); /***************建表******** ...
- 剑指offer面试题14-调整数组顺序使奇数位于偶数前面
题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得全部奇数位于数组的前半部分.全部偶数位于数组的后半部分. 前后分的这个.,让我想起来高速排序.好吧,就用这个做. 考虑到了排序的可扩 ...