我正在尝试实现一种排序算法,该算法按给定的字母排列对单词列表进行排序。 (例如,如果给出排列“zyxwvutsrqponmlkjihgfedcba”和单词“ant,bear,cat,zoo,animal”的列表,我的算法将返回“动物园,猫,熊,蚂蚁,动物”)我可以想到一种方法通过将单词的每个字母与另一个单词的字母进行比较来做到这一点,但这会花费太长时间。是否有一种优化的方法来实现这个算法,以便它可以更快地对单词进行排序?
答案 0 :(得分:2)
您可以使用HashMap实现自定义比较器:
\burl
请注意这个比较器除了你定义的字符之外还放置其他所有字符。如果你想把它们放在其他东西之后,请使用:
import java.util.*;
public class Main {
public static class PermutationComparator implements Comparator<String> {
private final Map<Character, Integer> order;
public PermutationComparator(String permutation) {
this.order = new HashMap<Character, Integer>();
for (int i = 0; i < permutation.length(); i++) {
order.put(permutation.charAt(i), i);
}
}
private int getOrder(char c) {
Integer value = order.get(c);
if (value == null) return -1;
return value;
}
@Override
public int compare(String o1, String o2) {
for (int i = 0; i < Math.min(o1.length(), o2.length()); i++) {
int compare = Integer.compare(getOrder(o1.charAt(i)), getOrder(o2.charAt(i)));
if (compare != 0) return compare;
}
return Integer.compare(o1.length(), o2.length());
}
}
public static void main(String... args) {
String[] strings = {"ant", "bear", "cat", "zoo", "animal"};
Arrays.sort(strings, new PermutationComparator("zyxwvutsrqponmlkjihgfedcba"));
System.out.println(Arrays.toString(strings));
}
}
如果您想要不区分大小写,请使用:
if (value == null) return order.size();