对 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 条评论
登录 后参与评论

相关文章

来自专栏曾大稳的博客

c++基础语法

注意:在开发过程中,cpp或者c会被编译为dll或者so供其调用者使用,一般把public的函数定义到h文件,不然调用者都不知道有哪些函数。

963
来自专栏LanceToBigData

JavaSE(八)之Map总结

上一篇是总结了Collection接口的各种实现类,这一篇我将分享的是Map的总结,希望大家点评! 一、Map接口 1.1、为什么Collection不能满足集...

19810
来自专栏Android开发指南

12:集合map、工具类

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

Java基础-17(01)总结,TreeSet,LinkHashSet

(3)TreeSet集合 A:底层数据结构是红黑树(是一个自平衡的二叉树) B:保证元素的排序方式 a:自然排序(元素具备比较性) 让元素所属的类实现C...

3056
来自专栏武培轩的专栏

剑指Offer-和为S的两个数字

题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 输出描述: 对应每...

3134
来自专栏海说

16、Collection接口及其子接口Set和List(常用类LinkedList,ArrayList,Vector和Stack)

16、Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(...

2140
来自专栏黑泽君的专栏

java基础学习_集合类02_List的子类、泛型、增强for循环、静态导入、可变参数_day16总结

============================================================================= ==...

561
来自专栏Bingo的深度学习杂货店

Q35 Search Insert Position

Given a sorted array and a target value, return the index if the target is found...

2747
来自专栏别先生

Map集合遍历的四种方式理解和简单使用

~Map集合是键值对形式存储值的,所以遍历Map集合无非就是获取键和值,根据实际需求,进行获取键和值 1:无非就是通过map.keySet()获取到值,然后根据...

1946
来自专栏LanceToBigData

JavaSE集合(八)之Map

前面给大家介绍了集合家族中的Collection家族,这一篇给大家分享的是集合中的另一个家族就是Map家族。以前的时候学习Map的时候没有很认真的去学习,我觉得...

2078

扫码关注云+社区