关于集合的一道JAVA机试题:将字符串中的内容去重按字母分组

1 篇文章 0 订阅
1 篇文章 0 订阅

周五面试了一家IT公司,出了这样一道面试题。将字符串中的内容去重按字母分组

内容是String aa="abc,smd,ca,bba,acb,cab,ca,ac,ab"; 

输出:abc,acb,cab          ca,ac          smd      bba,ab

当时考虑的是去重然后迭代去对比,想的及其复杂。搞了一个多小时。外加紧张,问题多多,导致没整出来。 出来以后同事给我说你怎么不用TreeMap集合自带的排序去解决?我顿时就把心中的郁闷抛开了。不然回家以后一天不会吃下去饭。

下面是回家以后敲出来的代码,两种方法。

方法一:TreeMap

 public static void main(String[] args) {
        // TODO Auto-generated method stubring
        //去重排序,分组
        String aa="abc,smd,ca,bba,acb,cab,ca,ac,ab";
        String[] aas = aa.split(",");
        TreeMap<String, String> treeMap=null;
        List<TreeMap<String, String>> arrayList = new ArrayList<>();
        for (String str : aas) {
                treeMap = new TreeMap<>();
            for (int i = 0; i < str.length(); i++) {
                treeMap.put(str.substring(i, i+1), str);
            }
            arrayList.add(treeMap);
        }
        Map<String, String> dataMap = new HashMap<>();
        for (TreeMap<String, String> map : arrayList) {
            Iterator<String> it = map.keySet().iterator();
            StringBuilder sst=new StringBuilder();
            String value = null;
            while (it.hasNext()) {
                String next = it.next();
                sst.append(next);
                 value = map.get(next);
            }
            if(dataMap.get(sst+"")==null){
                dataMap.put(sst+"", value);
            }else{
                String string = dataMap.get(sst+"");
               if(!string.contains(value)){
                   dataMap.put(sst+"",string+","+value); 
               }
               
            }
           
        }
        System.out.println(dataMap);
    }

         结果如下:{abc=abc,acb,cab, ac=ca,ac, dms=smd, ab=bba,ab}

方法二: Collections.sort(arrayList);    利用集合中自带的sort排序方法

public static void main(String[] args) {
    String aa="abc,mc,cd,cm,aab,abb,bac,abc";
    String[] split = aa.split(",");
    List<String> arrayList = null;
    Map<List<String>, Object> hashMap = new HashMap<>();
    for (String string : split) {
        arrayList=new ArrayList<>();
        for (int i = 0; i < string.length(); i++) {
            arrayList.add(string.substring(i, i+1));
        }
        Collections.sort(arrayList);
        if(hashMap.get(arrayList)!=null){
            String st = hashMap.get(arrayList).toString();
            if(!st.contains(string))
                hashMap.put(arrayList, hashMap.get(arrayList)+","+string);
            
        }else{
            hashMap.put(arrayList, string);
        }
       
    }
    System.out.println(hashMap);
}

输出结果:{[c, d]=cd, [c, m]=mc,cm, [a, b, b]=abb, [a, b, c]=abc,bac, [a, a, b]=aab}

-------------------------------------------------------------------------------------------------------------------------------------

还有一个是将字符串按长短分组。这是当时那个面试官奇哥问我的,当时紧张大脑感觉像是空白状态,被大佬的技术深深折服。

回家以后冷静下来花了十多分钟自己也敲了两边。考研的是逻辑思维能力。很简单如果思路不清晰,就会短片。

代码如下:

 

public static void main(String[] args) {
      String aa="张三,历史,数学,王大妈,李大爷,请了备受,12345";
      String[] sp = aa.split(",");
      Map<Integer, String> hashMap = new HashMap<>();
     for (String str : sp) {
         if(null==hashMap.get(str.length())) {
             hashMap.put(str.length(), str);
         }else{
             hashMap.put(str.length(), hashMap.get(str.length())+","+str);
         }
    }
     System.out.println(hashMap);
    }


结果如下:

{2=张三,历史,数学, 3=王大妈,李大爷, 4=请了备受, 5=12345}

这次面试没通过,但是给我的收获是蛮多的。希望多多向那些老一辈的开发前辈学习。当然我相信问题的解决方法不只是这几种,如果大家有什么更好的思路也可以交流一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值