对 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 保证自然顺序

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏偏前端工程师的驿站

Java魔法堂:解读基于Type Erasure的泛型

一、前言                               还记得JDK1.4时遍历列表的辛酸吗?我可是记忆犹新啊,那时因项目需求我从C#转身到Jav...

2075
来自专栏有趣的Python

慕课网-C++远征之多态篇(中)-学习笔记

c++远征之多态篇 纯虚函数 & 抽象类 例子: class Shape { public: virtual double calcArea()//虚函...

2954
来自专栏Java帮帮-微信公众号-技术文章全总结

第十八天 集合-泛型&list接口&set接口【面试+工作】

泛型的使用:一般在创建对象时,将未知的类型确定具体的类型。当没有指定泛型时,默认类型为Object类型。

802
来自专栏IT可乐

JDK1.8源码(二)——java.lang.Integer 类

  上一篇博客我们介绍了 java.lang 包下的 Object 类,那么本篇博客接着介绍该包下的另一个类 Integer。在前面 浅谈 Integer 类 ...

3606
来自专栏IT可乐

JDK1.8源码(四)——java.util.Arrays 类

  java.util.Arrays 类是 JDK 提供的一个工具类,用来处理数组的各种方法,而且每个方法基本上都是静态方法,能直接通过类名Arrays调用。 ...

2924
来自专栏CodingToDie

百篇(2):c# 学习笔记

C# hello world /** 基本格式 */ using System; using System.Collections.Generic; u...

2824
来自专栏偏前端工程师的驿站

Java魔法堂:解读基于Type Erasure的泛型

一、前言                               还记得JDK1.4时遍历列表的辛酸吗?我可是记忆犹新啊,那时因项目需求我从C#转身到Jav...

1928
来自专栏风口上的猪的文章

.NET面试题系列[9] - IEnumerable

IEnumerable及IEnumerable的泛型版本IEnumerable<T>是一个接口,它只含有一个方法GetEnumerator。Enumerable...

822
来自专栏mathor

Iterator

994
来自专栏拭心的安卓进阶之路

深入理解 Java 反射:Class (反射的入口)

深入理解 Java 反射系列: 深入理解 Java 反射:Class (反射的入口) 深入理解 Java 反射:Field (成员变量) 深入理解 Java ...

20210

扫码关注云+社区