实现字符串分组 [“ate”,”att”,”test”,”ttes”,”tae”] 分组结果是
[[“ate”,”tae”],[“test”,”ttes],[“att”]]
构题思路:
把多有的字符串元素排序重而的出一组有重复值的字符串集合
public static String stringSort(String s) {
ArrayList strings = new ArrayList<>();
for (int i = 0; i < s.length(); i++) {
strings.add(s.charAt(i));
}
strings.sort((Comparator.comparingInt(o -> o)));
s = "";
for (int i = 0; i < strings.size(); i++) {
s += strings.get(i);
}
return s;
}
还需要一个去除集合重复值的方法
public static ArrayList deduplication(ArrayList list){
HashSet set = new HashSet<>(list);
list.clear();
list.addAll(set);
return list;
}
把集合存入map集合中,第一次存入会把重复值给覆盖,但是我们需要的是他的键值就可以了,第二次存入map集合当中需要判断是否追加值,这样会得到一个拥有重复值的下标集合,这时候我们的去除重复值的方法就有用武之地了,去重之后就可以得到一个相同英文组成的字符串数组的下标
public static ArrayList> sort(String[] strings) {
HashMap> map = new HashMap<>();
for (int i = 0; i < strings.length; i++) {
ArrayList list = new ArrayList<>();
list.add(i);
map.put(stringSort(strings[i]), list);
}
Set strings1 = map.keySet();
for (int i = 0; i < strings.length; i++) {
for (String s : strings1) {
String anObject = stringSort(strings[i]);
if (s.equals(anObject)) {
ArrayList list = map.get(s);
list.add(i);
deduplication(list);
map.put(stringSort(strings[i]), list);
}
}
}
ArrayList> list = new ArrayList<>();
for (String s : strings1) {
list.add(map.get(s));
}
return list;
}