有没有一种简单的方法可以将有序列表转换为查找表?

时间:2020-05-06 12:15:02

标签: java lookup-tables

如果我使用Arrays.asList()创建一个列表,则保证该列表按插入顺序分配。我想以此方式轻松定义类顶部比较器的排序顺序:

List<String> sortedKeyOrder = Arrays.asList("x", "y", "z");

是否有一种简单的方法可以将该列表的插入顺序转换为比较器的恒定时间查找表?

1 个答案:

答案 0 :(得分:1)

您可以创建一个返回libopenblas的静态方法,该方法由这样的地图支持:

Comparator

这将打印public static <T> Comparator<T> lookupComparator(Iterable<T> order) { int index = 0; final Map<T, Integer> orderMap = new HashMap<T, Integer>(); for (T t : order) { orderMap.put(t, index++); } return new Comparator<T>() { @Override public int compare(T o1, T o2) { Objects.requireNonNull(o1); Objects.requireNonNull(o2); if (o1 == o2) { return 0; } return orderMap.get(o1).compareTo(orderMap.get(o2)); } }; } @Test public void testLookupComparator() { Comparator<String> lc = lookupComparator(Arrays.asList("c", "a", "b", "z", "m", "g")); List<String> someValues = Arrays.asList("a", "b", "c", "g", "m", "z"); someValues.sort(lc); System.out.println(someValues); } 。但是,如果任一值是[c, a, b, z, m, g],或者地图中没有该值,它将引发异常。