Java中Map和Set练习项目实例代码

 更新时间:2024年11月13日 09:16:23   作者:小川_wenxun  
这篇文章主要给大家介绍了关于Java中Map和Set练习项目的相关资料,首先介绍了如何使用map来统计字符串数组中每个字符串的出现次数,然后讨论了如何使用set来找出只出现一次的数字,最后提出了一个解决坏键盘打字问题的思路,需要的朋友可以参考下

查找字母出现的次数

这道题的思路在后面的题目过程中能用到,所以先把这题给写出来

题目要求:给出一个字符串数组,要求输出结果为其中每个字符串及其出现次数。

思路:我们可以把数组里的字符串按顺序放进map中,对于没被放进去过的字符串,放进去次数为1,之前被放进过去的字符串,那就在其上重新放入,并把次数重新加1.

举个例子,输出的内容是:

"this", "dog", "cat", "cat", "this", "dog"

现在是把每个元素放进去,在没遇到一样数据之前的过程,如是上面所示,如果遇到了一样的数据, 

这个操作看起来可能是把第二个cat放进去了,但是实际上是把cat重新输入了,然后把Key值输入为2了。因为map其中节点的样子如上图所示。

代码部分如下

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class Test {
    public static Map<String, Integer> countWords(String[] words){
        Map<String, Integer> map = new HashMap<>();
        for(String word : words){
            if(map.get(word) == null){
                map.put(word, 1);
            }else {
                int val = map.get(word);
                map.put(word, val+1);
            }
        }
        return map;
    }

    public static void main(String[] args) {
        String[] words = {"this", "dog", "cat", "cat", "this", "dog"};
        Map<String, Integer> map = countWords(words);
        Set<Map.Entry<String, Integer>> entryset = map.entrySet();
        for (Map.Entry<String, Integer> entry : entryset){
            System.out.println("Key: " + entry + "  Val: " + entry.getKey());
        }
    }
}

只出现一次的数字

题目链接:只出现一次的数字 - 力扣(LeetCode)

题目描述:给一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

思路:这里的思路和上面的 查找字母出现的次数 有些像。依次把元素放到set中,如果set中没有该元素,就把该元素放进去,如果有,就把这个元素从set中删去。最后输出set中的元素

以 {1,2,3,4,1,2,3} 为例,当第一次往里放,没有遇到重复的元素时,如下图

按照数组的顺序,接着向下放,就会遇到重复的元素,这时候就要把set中的元素给删除了

 后面的2,3也要依次从set中删除。

public static int singleNumber(int[] nums){
        HashSet<Integer> set = new HashSet<>();
        for (int i = 0; i < nums.length; i++) {
            if(set.contains(nums[i])){
                set.remove(nums[i]);
            }else{
                set.add(nums[i]);
            }
        }

        for (int i = 0; i < nums.length; i++) {
            if(set.contains(nums[i])){
                return nums[i];
            }
        }
        return -1;
    }

    public static void main(String[] args) {
        int[] array = {1,2,3,4,1,2,3};
        System.out.println(singleNumber(array));
    }

运行结果如下

坏键盘打字

题目链接:

题目描述:旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出肯定坏掉的那些键。

输入在两行中分别给出应该输入的文字、以及实际输入的文字

按照发现顺序,在一行中输出坏掉的键。其中英语字母只输出大写,每个坏键只输入一次。

示例

输入

7_This_is_a_test

_hs_s_a_es

输出

7TI

题目思路:该题的思路在于如何找出坏键,这里提供一种思路,先把实际输入的数据放到set中,然后再把应该输入的文字遍历一遍,如果其中有set中没有的数据,那些没有的数据便是坏掉的键。

public static void func(String str1, String str2){
        //将字符串大写
        str1 = str1.toUpperCase();
        str2 = str2.toUpperCase();

        HashSet<Character> setAct = new HashSet<>();
        for (int i = 0; i < str2.length(); i++) {
            char ch = str2.charAt(i);
            setAct.add(ch);
        }

        for (int i = 0; i < str1.length(); i++) {
            char ch = str1.charAt(i);
            if(!setAct.contains(ch)){

                System.out.print(ch);
            }
        }
    }

    public static void main(String[] args) {
        func("7_This_is_a_test", "_hs_s_a_es");
    }

这样的代码还是存在问题,没办法把其中重复出现的元素给消去,输出的结果是

现在问题变成了如何去重,这部分不难能想到,我们可以创建一个setBroken来存放已经查找到的坏键,如果set和setBroken中都没有这个元素才打印.

public class Test {
    public static void func(String str1, String str2){
        str1 = str1.toUpperCase(Locale.ROOT);
        str2 = str2.toUpperCase(Locale.ROOT);

        HashSet<Character> setAct = new HashSet<>();
        for (int i = 0; i < str2.length(); i++) {
            char ch = str2.charAt(i);
            setAct.add(ch);
        }

        //第一步是把不同的数给挑出来,然后对于重复输出的数据给去重
        HashSet<Character> setBroken = new HashSet<>();
        for (int i = 0; i < str1.length(); i++) {
            char ch = str1.charAt(i);
            if(!setAct.contains(ch) && !setBroken.contains(ch)){
                setBroken.add(ch);
                System.out.print(ch);
            }
        }
    }

    public static void main(String[] args) {
        func("7_This_is_a_test", "_hs_s_a_es");
    }
}

输出结果为

总结

到此这篇关于Java中Map和Set练习项目的文章就介绍到这了,更多相关Java Map和Set练习内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot拦截器如何获取http请求参数

    SpringBoot拦截器如何获取http请求参数

    这篇文章主要给大家介绍了SpringBoot拦截器如何获取http请求参数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Java集合之Set接口及其实现类精解

    Java集合之Set接口及其实现类精解

    set接口是继承自Collection的子接口,特点是元素不重复,存储无序。在set接口的实现类中添加重复元素是不会成功的,判断两个元素是否重复根据元素类重写的
    2021-09-09
  • Spring与Shiro整合及加载权限表达式问题

    Spring与Shiro整合及加载权限表达式问题

    这篇文章主要介绍了Spring与Shiro整合及加载权限表达式问题,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12
  • Java+opencv3.2.0实现模板匹配

    Java+opencv3.2.0实现模板匹配

    这篇文章主要为大家详细介绍了Java+opencv3.2.0实现模板匹配的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • 解决springcloud Zuul丢失Cookie的问题

    解决springcloud Zuul丢失Cookie的问题

    这篇文章主要介绍了解决springcloud Zuul丢失Cookie的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • 使用jaxp进行dom解析_动力节点Java学院整理

    使用jaxp进行dom解析_动力节点Java学院整理

    这篇文章主要介绍了使用jaxp进行dom解析的相关资料,需要的朋友可以参考下
    2017-08-08
  • Java中HashMap和TreeMap的区别深入理解

    Java中HashMap和TreeMap的区别深入理解

    首先介绍一下什么是Map。在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value
    2012-12-12
  • java使用OpenCV从视频文件中获取帧

    java使用OpenCV从视频文件中获取帧

    这篇文章主要为大家详细介绍了java使用OpenCV从视频文件中获取帧,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • java 设计模式从风控链理解责任链模式

    java 设计模式从风控链理解责任链模式

    这篇文章主要为大家介绍了java 设计模式从风控链理解责任链模式示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • 浅谈java object对象在heap中的结构

    浅谈java object对象在heap中的结构

    本文主要介绍了浅谈java object对象在heap中的结构,感兴趣的同学,可以参考下。
    2021-06-06

最新评论