按字母排列排序
Sort by alphabetical permutation
我正在尝试实现一种排序算法,该算法按给定的字母顺序排列对单词列表进行排序。 (例如,如果给定排列 "zyxwvutsrqponmlkjihgfedcba" 和单词列表 "ant, bear, cat, zoo, animal" 我的算法将 return "zoo, cat, bear, ant, animal")我可以想出一种方法来比较每个字母带有另一个单词字母的单词,但这会花费太长时间。有没有一种优化的方法来实现这个算法,以便它可以更快地对单词进行排序?
您可以使用 HashMap 实现自定义比较器:
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();
如果您想不区分大小写,请使用:
Integer value = order.get(Character.toLowerCase(c));
我正在尝试实现一种排序算法,该算法按给定的字母顺序排列对单词列表进行排序。 (例如,如果给定排列 "zyxwvutsrqponmlkjihgfedcba" 和单词列表 "ant, bear, cat, zoo, animal" 我的算法将 return "zoo, cat, bear, ant, animal")我可以想出一种方法来比较每个字母带有另一个单词字母的单词,但这会花费太长时间。有没有一种优化的方法来实现这个算法,以便它可以更快地对单词进行排序?
您可以使用 HashMap 实现自定义比较器:
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();
如果您想不区分大小写,请使用:
Integer value = order.get(Character.toLowerCase(c));