我们直接切入正题。首先大致介绍一下 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 集合的巧妙利用的更多相关文章

  1. 死磕 java集合之CopyOnWriteArraySet源码分析——内含巧妙设计

    问题 (1)CopyOnWriteArraySet是用Map实现的吗? (2)CopyOnWriteArraySet是有序的吗? (3)CopyOnWriteArraySet是并发安全的吗? (4)C ...

  2. Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结

    2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...

  3. Java集合(2)一 ArrayList 与 LinkList

    目录 Java集合(1)一 集合框架 Java集合(2)一 ArrayList 与 LinkList Java集合(3)一 红黑树.TreeMap与TreeSet(上) Java集合(4)一 红黑树. ...

  4. Java集合分析

    Java集合分析 前言 从开始接触Java的时候, 就在强调的一个重要版块, 集合. 终于能够开始对它的源码进行分析, 理解, 如果不懂得背后的思想, 那么读懂代码, 也仅仅是读懂了 if else ...

  5. java集合源码分析(六):HashMap

    概述 HashMap 是 Map 接口下一个线程不安全的,基于哈希表的实现类.由于他解决哈希冲突的方式是分离链表法,也就是拉链法,因此他的数据结构是数组+链表,在 JDK8 以后,当哈希冲突严重时,H ...

  6. Java集合框架List,Map,Set等全面介绍

    Java集合框架的基本接口/类层次结构: java.util.Collection [I]+--java.util.List [I]   +--java.util.ArrayList [C]   +- ...

  7. (转)Java集合框架:HashMap

    来源:朱小厮 链接:http://blog.csdn.net/u013256816/article/details/50912762 Java集合框架概述 Java集合框架无论是在工作.学习.面试中都 ...

  8. Java提高篇(三五)-----Java集合细节(一):请为集合指定初始容量

    集合是我们在Java编程中使用非常广泛的,它就像大海,海纳百川,像万能容器,盛装万物,而且这个大海,万能容器还可以无限变大(如果条件允许).当这个海.容器的量变得非常大的时候,它的初始容量就会显得很重 ...

  9. Java集合源码分析(二)ArrayList

    ArrayList简介 ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存. ArrayList不是线程安全的,只能用在单线程环境下,多线 ...

随机推荐

  1. PHP大文件分割上传(分片上传)

    服务端为什么不能直接传大文件?跟php.ini里面的几个配置有关 upload_max_filesize = 2M //PHP最大能接受的文件大小 post_max_size = 8M //PHP能收 ...

  2. Aurora 论坛图片下载

    Aurora 论坛图片下载是一款快速下载指定网页图片的利器,还可以下载高清原图呢.现支持的网站:①蜂鸟网论坛②中关村摄影论坛③POCO摄影空间④图虫网其他摄影论坛陆续添加中... 效果图: 项目地址: ...

  3. suds库使用说明官方文档

    OVERVIEW The Suds web services client is a lightweight soap-based client for python the is licensed ...

  4. 代码管理 ,git 命令整理

    //先要理解这四个概念,这是一个提交代码的流动轨迹:1.工作区(编辑器)-经过add到2- 2.暂存区 (缓存)- 经过commit3-3.本地仓库 (本地项目)-经过 push4-4.远程仓库 (线 ...

  5. DOM操作整理

    DOM获取 1. 直接获取 document.getElementById("box_id") 通过ID获取 document.getElementsByName("my ...

  6. git上传本地文件到gitlab

    The repository for this project is empty If you already have files you can push them using command l ...

  7. Java IO(3)非阻塞式输入输出(NIO)

    在上篇<Java IO(2)阻塞式输入输出(BIO)>的末尾谈到了什么是阻塞式输入输出,通过Socket编程对其有了大致了解.现在再重新回顾梳理一下,对于只有一个“客户端”和一个“服务器端 ...

  8. Android Things 专题6 完整的栗子:运用TensorFlow解析图像

    文| 谷歌开发技术专家 (GDE) 王玉成 (York Wang) 前面絮叨了这么多.好像还没有一个整体的概念.我们怎样写一个完整的代码呢? 如今深度学习非常火,那我们就在Android Things ...

  9. 开源 免费 java CMS - FreeCMS1.9 移动APP管理 执行配置

    项目地址:http://www.freeteam.cn/ 移动APP管理 从FreeCMS 1.8開始支持 执行配置 管理会员能够在这里设置移动app的欢迎图片. 从左側管理菜单点击执行配置进入. 选 ...

  10. xcode 6 改动组织及开发人员

    搞个ios 开发死去活来的,各个地方说的都不一样,defaults write 不好用 在xcode6中 改动方法例如以下 改动create by __FULLUSERNAME___ 部分 Syste ...