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