Java同字母异序词查找

Java同字母异序词查找

先分析一下这个题目,主要是对字符串中所包含的单词进行字母去重、返回单词的操作,鉴于对字符串操作以及每个单词的索引的需求,这里将采用map集合来进行操作,可以分为以下几个部分

  • 一堆字符串中相同字母组成的单词,
  • 例如(“hello,say,heello,asy,appo,apo,xiao,oiax,niexiaoqian”)
  •  1.分割字符串,将单词逐个录入map数组
    
  •  2.单个单词的字母去重,建立包含去重字母的单词集合,索引与原集合相同
    
  •  3.输出去重字母的单词集合中value值相同的key,建立集合keyList
    
  •  4.遍历keyList输出map集合对应的value
    

我们把这四部分先不考录具体实现步骤用代码简略实现下:

 private static void comparChar( String str) {
        //1.分割字符串,将单词逐个录入map数组
        String[] list = str.split(",");

        Map<Integer,String> map = new HashMap<>();
        Map<Integer,String> map2 = new HashMap<>();
        for (int i = 0; i < list.length; i++) {
        //2.根据key,单个单词去重,修改value,
            String value = setStr(list[i]);
            map.put(i,list[i]);
            map2.put(i,value);//该集合为获取索引的集合
        }
        //3.输出value值相同的key,建立集合keyList
        LinkedHashSet<Integer> keyList = setMap(map2);
        //4.遍历keyList输出value
        for (Integer key : keyList) {
            System.out.println(key+":"+map.get(key));
        }

    }

然后再补充方法:

  • 单个单词去重 setStr(String a)
  • 比较value值是否相同,相同则保存索引,建立索引集合setMap(Map map)

方法-单词去重:


    private static String setStr(String value) {
        //1.单个单词的字母去重
        Set<Character> set = new HashSet<Character>();
        StringBuffer sb = new StringBuffer();

        for (int i = 0; i <value.length(); i++) {
            set.add(value.charAt(i));
        }
        for (Character c : set) {
            sb.append(c);
        }
        return sb.toString();

    }

利用Set集合的重复元素添加返回false的特性,将单词逐字母填充,达到去重效果。

方法-Map集合value去重:

 private static LinkedHashSet<Integer> setMap(Map<Integer, String> map2) {
        //对map中的value值进行去重,返回重复单词的索引集合,ArrayList
        LinkedHashSet<Integer> keyList=new LinkedHashSet<>();

        int count = 0;
        for(Map.Entry<Integer, String> vo1 : map2.entrySet()){
            count++;
        }
        //每个去重的单词逐个向前比较,若相等,则将索引放入集合
        for (int i = 0; i < count; i++) {
            for (int j = i+1;  j< count; j++) {
                if (map2.get(i).equals(map2.get(j))){
                    keyList.add(i);
                    keyList.add(j);
                }
            }
        }
        return keyList;
    }

利用LinkedHashSet的有序及不重复的特性,对map集合的value值进行比较后产生的索引值进行保存,返回LinkedHashSet列表。

方法完善后,我们的4个步骤是不是也丰满了许多。接下来我们可以尝试将这三个方法通过主方法调用,调试我们的结果了~

public static void main(String[] args) {
        String  str= "hello,say,hheelloo,sdays";
        comparChar(str);
    }

结果如下:
0:hello
2:hheelloo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值