练习题整理 -- 精妙的逻辑

Arrays、常用类方法

统计字母出现的个数

*   统计字母出现个数情况1个字符串中可能包含a-z中的多个字符,字符也可能重复,
    例如:String data =“aabcexmkduyruieiopxzkkkkasdfjxjdsds”;
    写一个程序,对于给定一个这样的字符串求出字符串出现次数最多的那个字母以及出现的次数
   (若次数最多的字母有多个,则全部求出)*/

    public static void main(String[] args) {
        String data ="aabcexmkduyruieiopxzkkkkasdfjxjdsds";

        int[] counts = new int[26];
        char[] chars = data.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            counts[chars[i]-97]++;  //惊了!

       //找出最多次数值
        int max = counts[0];
        for (int i = 1; i < counts.length; i++) {
            if(max < counts[i]) {
                max = counts[i];
            }
        }
        //找出所有最多次数字母
        for (int i = 0; i < counts.length; i++) {
            if(counts[i] == max) {
                System.out.println((char)(i+97));
            }
        }
    }

筛选字符串

定义数组,存入多个字符串。删除长度大于5的字符串,打印删除后的数组。

/* 筛选字符串
    定义数组,存入多个字符串。删除长度大于5的字符串,打印删除后的数组。
    效果如图所示:*/
    public static void main(String[] args) {
        String[] arr = {"helloworld","java","chai","atguigu","lin","yan","I love you"};
        //重点理解 arraycopy方法
        int index = 0;
        int length = arr.length;    
        while(index < length){
            if(arr[index].length()>5){  //大于5则调用方法,使长度-1
                System.arraycopy(arr, index+1, arr, index, length-index-1);
                length--;
            }else{          //否则下标前进1
                index++;
            }
        }
        //删除后
        arr = Arrays.copyOf(arr, length);
        System.out.println(Arrays.toString(arr));   //[java, chai, lin, yan]
    }

获取两个字符串中最大相同子串

获取两个字符串中最大相同子串。

比如:str1 = "abcwerthelloyuiodef“; str2 = "cvhellobnm",最大相同子串是"hello"。

 public static void main(String[] args) {
        String str=findMaxSubString("abcwerthelloyuiodef","cvhellobnm");
        System.out.println(str);    //hello
    }
    //提示:将短的那个串进行长度依次递减的子串与较长的串比较。
    public static String findMaxSubString(String str1,String str2){
        String maxstr="";
        int max = 0;

        String maxStr = str1.length()>str2.length()? str1:str2;
        String minStr = str1.length()<str2.length()? str1:str2;
        //外循环控制从左到右的下标,内循环控制从右到左的下标
        for (int i = 0; i < minStr.length(); i++) {
            for (int j = minStr.length(); j >= i ; j--) {
                String ss = minStr.substring(i, j);
                if(maxStr.indexOf(ss)>=0){  //contains底层调用了indexOf
                    //判断是否最大字符串
                    if(max<ss.length()){
                        max=ss.length();
                        maxstr = ss;
                    }
                }
            }
        }
        return maxstr;
    }

Map、List集合嵌套:菜单的二级联动效果 

fb908fe9702a4e88b8032ec274954ff6.png

/*菜单的二级联动效果
现有全国各省市信息字符串如下:
开发提示:
(1)把字符串str字符串先按照;进行拆分,得到34个省(包括23个省,5个自治区,4个直辖市,
2个特别行政区,下面的题目描述中,把它们都成为省份)
(2)然后把每个省的字符串,按照:进行拆分,那么:左边的是省份名称,:右边的是该省的各市辖区
(3)把34个省存储到一个HashMap集合中,其中编号是key,省份名是value
(4)把所有省份的城市存储到一个LinkedHashMap集合中,其中省份名是key,
该省份的所有城市用一个ArrayList的集合装起来,然后作为value。
(5)注意,字符串处理过程中,注意:[、]、,、'等标点符号的处理
例如:
*/
    public static void main(String[] args) {
        String str = "'北京': ['北京'];"
                + "'上海': ['上海'];"
                + "'天津': ['天津'];"
                + "'重庆': ['重庆'];"
                + "'河北省': ['石家庄', '张家口', '承德', '秦皇岛', '唐山', '廊坊', '保定', '沧州', '衡水', '邢台', '邯郸'];"
                + "'山西省': ['太原', '大同', '朔州', '阳泉', '长治', '晋城', '忻州', '吕梁', '晋中', '临汾', '运城'];"
                + "'辽宁省': ['沈阳', '朝阳', '阜新', '铁岭', '抚顺', '本溪', '辽阳', '鞍山', '丹东', '大连', '营口', '盘锦', '锦州', '葫芦岛'];"
                + "'吉林省': ['长春', '白城', '松原', '吉林', '四平', '辽源', '通化', '白山', '延边'];"
                + "'黑龙江省': ['哈尔滨', '齐齐哈尔', '黑河', '大庆', '伊春', '鹤岗', '佳木斯', '双鸭山', '七台河', '鸡西', '牡丹江', '绥化', '大兴安'];"
                + "'江苏省': ['南京', '徐州', '连云港', '宿迁', '淮阴', '盐城', '扬州', '泰州', '南通', '镇江', '常州', '无锡', '苏州'];"
                + "'浙江省': ['杭州', '湖州', '嘉兴', '舟山', '宁波', '绍兴', '金华', '台州', '温州', '丽水','衢州'];"
                + "'安徽省': ['合肥', '宿州', '淮北', '阜阳', '蚌埠', '淮南', '滁州', '马鞍山', '芜湖', '铜陵', '安庆', '黄山', '六安', '巢湖', '池州', '宣城'];"
                + "'福建省': ['福州', '南平', '三明', '莆田', '泉州', '厦门', '漳州', '龙岩', '宁德'];"
                + "'江西省': ['南昌', '九江', '景德镇', '鹰潭', '新余', '萍乡', '赣州', '上饶', '抚州', '宜春', '吉安'];"
                + "'山东省': ['济南', '聊城', '德州', '东营', '淄博', '潍坊', '烟台', '威海', '青岛', '日照', '临沂', '枣庄', '济宁', '泰安', '莱芜', '滨州', '菏泽'];"
                + "'河南省': ['郑州', '三门峡', '洛阳', '焦作', '新乡', '鹤壁', '安阳', '濮阳', '开封', '商丘', '许昌', '漯河', '平顶山', '南阳', '信阳', '周口', '驻马店'];"
                + "'湖北省': ['武汉', '十堰', '襄攀', '荆门', '孝感', '黄冈', '鄂州', '黄石', '咸宁', '荆州', '宜昌', '恩施', '襄樊'];"
                + "'湖南省': ['长沙', '张家界', '常德', '益阳', '岳阳', '株洲', '湘潭', '衡阳', '郴州', '永州', '邵阳', '怀化', '娄底', '湘西'];"
                + "'广东省': ['广州', '清远', '韶关', '河源', '梅州', '潮州', '汕头', '揭阳', '汕尾', '惠州', '东莞', '深圳', '珠海', '江门', '佛山', '肇庆', '云浮', '阳江', '茂名', '湛江'];"
                + "'海南省': ['海口', '三亚'];"
                + "'四川省': ['成都', '广元', '绵阳', '德阳', '南充', '广安', '遂宁', '内江', '乐山', '自贡', '泸州', '宜宾', '攀枝花', '巴中', '达川', '资阳', '眉山', '雅安', '阿坝', '甘孜', '凉山'];"
                + "'贵州省': ['贵阳', '六盘水', '遵义', '毕节', '铜仁', '安顺', '黔东南', '黔南', '黔西南'];"
                + "'云南省': ['昆明', '曲靖', '玉溪', '丽江', '昭通', '思茅', '临沧', '保山', '德宏', '怒江', '迪庆', '大理', '楚雄', '红河', '文山', '西双版纳'];"
                + "'陕西省': ['西安', '延安', '铜川', '渭南', '咸阳', '宝鸡', '汉中', '榆林', '商洛', '安康'];"
                + "'甘肃省': ['兰州', '嘉峪关', '金昌', '白银', '天水', '酒泉', '张掖', '武威', '庆阳', '平凉', '定西', '陇南', '临夏', '甘南'];"
                + "'青海省': ['西宁', '海东', '西宁', '海北', '海南', '黄南', '果洛', '玉树', '海西'];"
                + "'内蒙古': ['呼和浩特', '包头', '乌海', '赤峰', '呼伦贝尔盟', '兴安盟', '哲里木盟', '锡林郭勒盟', '乌兰察布盟', '鄂尔多斯', '巴彦淖尔盟', '阿拉善盟'];"
                + "'广西': ['南宁', '桂林', '柳州', '梧州', '贵港', '玉林', '钦州', '北海', '防城港', '南宁', '百色', '河池', '柳州', '贺州'];"
                + "'西藏': ['拉萨', '那曲', '昌都', '林芝', '山南', '日喀则', '阿里'];"
                + "'宁夏': ['银川', '石嘴山', '吴忠', '固原'];"
                + "'新疆': ['乌鲁木齐', '克拉玛依', '喀什', '阿克苏', '和田', '吐鲁番', '哈密', '博尔塔拉', '昌吉', '巴音郭楞', '伊犁', '塔城', '阿勒泰'];"
                + "'香港': ['香港'];"
                + "'澳门': ['澳门'];"
                + "'台湾': ['台北', '台南', '其他']";

        /*(1)把字符串str字符串先按照;进行拆分,得到34个省(包括23个省,5个自治区,4个直辖市,
            2个特别行政区,下面的题目描述中,把它们都成为省份)
            (2)然后把每个省的字符串,按照:进行拆分,那么:左边的是省份名称,:右边的是该省的各市辖区
            (3)把34个省存储到一个HashMap集合中,其中编号是key,省份名是value
            (4)把所有省份的城市存储到一个LinkedHashMap集合中,其中省份名是key,
            该省份的所有城市用一个ArrayList的集合装起来,然后作为value。
            (5)注意,字符串处理过程中,注意:[、]、,、'等标点符号的处理*/
        Map<Integer,String> province  = new HashMap<>();  //存放 编号 : 省份
        Map<String,List> content = new LinkedHashMap<>(); //存放 省份: 数组
        String[] split = str.split(";");
        
        for (int i = 0; i < split.length; i++) {
            //区分省 市,此时按照:拆分 0位置是省份
            String[] split1 = split[i].split(":");
            //拆分并修剪出省份,
            String s = split1[0].replaceAll("\\'", "");
            //System.out.println(s);

            province.put(i+1,s);    //添加编号 : 省份

            //拆分出市区并修剪 此时按照:拆分 1位置是市区
            String s1 = split1[1].replaceAll("[\\[\\' \\]]","");
            //System.out.println(s1);

            String[] split2 = s1.split(",");
            List<String> city = new ArrayList<>();   //城市数组
            for (String s2 : split2) {
                city.add(s2);
            }
            //System.out.println(city);
            content.put(s,city);    //存放 省份: 数组
            
        }
        //遍历
        System.out.println();
        Set<Map.Entry<Integer, String>> entries = province.entrySet();
        Iterator<Map.Entry<Integer, String>> iterator = entries.iterator();
        for (Map.Entry<Integer, String> node : entries) {
            System.out.println(node.getKey()+": "+node.getValue());
        }

        System.out.println("请选择您选择的省份编号(1-34):");
        Scanner scanner = new Scanner(System.in);
        Integer falg = scanner.nextInt();
        List list = content.get(province.get(falg));
        if(list!=null){
            System.out.println("该省份共有辖区"+list);
        }
    }

 Map集合 特点为无序不可重复。 为什么这道题遍历出来的为有序?

因为这道题的Key部分为 Integer,而Integer的hashCode为其本身

  •  HashMap 无序不可重复,遍历出来却变的有序?

HashMap的Key部分如果存储是为 Integer 类型,其hashCode便是其本身,那么每一个桶中将只有一个元素,结构会变成一个一维数组,因此取出时会变得有序。

Integer.hashCode 源码: 

37922083d9c246fea63aee33acbd1ff6.png

Returns a hash code for this Integer.
Returns:  a hash code value for this object, equal to the primitive int value represented by this Integer object.

返回此整数的哈希码。  

返回:   该对象的哈希码值,等于由这个Integer对象表示的原始int值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值