对 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不是线程安全的,只能用在单线程环境下,多线 ...
随机推荐
- numpy中关于*和dot的区别
1.numpy乘法运算中"*"是数组元素逐个计算 >>> import numpy as np >>> a = np.array([[2,3], ...
- window下phpstudy的nginx配置虚拟主机
由于很长时间没有配置Apache,虽然说知道怎么配置nginx,但是还是花费了一些时间这次记下来下次直接用 在其他选项文件菜单中->打开配置文件->选择vhosts-conf nginx的 ...
- Git命令汇总(补充篇)
上一篇<Git命令汇总基础篇>总结了使用Git的基本命令,这一篇作为补充主要给大家讲一些平时使用中的技巧和总结 . 学会了这些命令,已经基本解决了使用Git中大部分问题. 1.gitign ...
- ibv_open_device()函数
struct ibv_context *ibv_open_device(struct ibv_device *device); 描述 函数会创建一个RDMA设备相关的context:可以通过ibv_c ...
- Relax信息学题库须知
Relax信息学题库须知 1.本题库于2017.10.15开始建设(建设中),私聊我便可成为题库管理员,关注我即可成为题库成员.我的QQ:2026503022,微信:dy060207. 2.本题库的建 ...
- JWT.NET的使用
JWT是什么 JWT全称是Json Web Token,是一种用于双方之间传递安全信息的简洁的.URL安全的表述性声明规范.JWT作为一个开放的标准( RFC 7519 ),定义了一种简洁的,自包含的 ...
- 自学Python全栈开发第一次笔记
我已经跟着视频自学好几天Python全栈开发了,今天决定听老师的,开始写blog,听说大神都回来写blog来记录自己的成长. 我特别认真的跟着这个视频来学习,(他们开课前的保证书,我也写 ...
- Ext表单验证
//大家在很多的extjs代码中都看到了这两个,他们都起提示作用的Ext.QuickTips.init();//支持tips提示Ext.form.Field.prototype.msgTarget=' ...
- opencv批处理提取图像的特征
____________________________________________________________________________________________________ ...
- 编译器 STVD 与 IAR 的差别 个人体验
编译器 STVD 与 IAR 的一些差别,这些事个人的体验,欢迎扔砖和指点或者补充. 1:全局查找功能: STVD:全局查找功能全局查找功能比較麻烦.有3个动作. IAR:有全局查找功能比較方便.仅仅 ...