假设我有
final Iterable<String> unsorted = asList("FOO", "BAR", "PREFA", "ZOO", "PREFZ", "PREFOO");我可以做些什么将这个未排序的列表转换成这个列表:
[PREFZ, PREFA, BAR, FOO, PREFOO, ZOO](该列表以必须首先出现的已知值开头(此处为"PREFA“和"PREFZ"),其余值按字母顺序排序)
我认为在芭乐中有一些有用的类可以完成这项工作(排序、谓词……),但我还没有找到解决方案……
发布于 2010-06-25 05:38:50
你特别提到了芭乐;除了Sylvain M的答案,还有另一种方式(更多的是作为一种学术练习和芭乐灵活性的演示)
// List is not efficient here; for large problems, something like SkipList
// is more suitable
private static final List<String> KNOWN_INDEXES = asList("PREFZ", "PREFA");
private static final Function<Object, Integer> POSITION_IN_KNOWN_INDEXES
= new Function<Object, Integer>() {
public Integer apply(Object in) {
int index = KNOWN_INDEXES.indexOf(in);
return index == -1 ? null : index;
}
};
...
List<String> values = asList("FOO", "BAR", "PREFA", "ZOO", "PREFZ", "PREFOO");
Collections.sort(values,
Ordering.natural().nullsLast().onResultOf(POSITION_IN_KNOWN_INDEXES).compound(Ordering.natural())
);因此,换句话说,按照List.indexOf()返回的Integer的自然顺序进行排序,然后断开与对象本身的自然顺序的关系。
凌乱,也许,但有趣。
发布于 2010-06-24 21:43:10
我会保持不同的列表。
一个用于已知值和未知值。并分别对它们进行排序,当您需要将它们放在一个列表中时,您可以将它们连接起来。
knownUnsorted.addAll(unsorted.size - 1, unknonwUnsorted);发布于 2010-06-24 21:54:27
我建议使用您的值填充List并使用Collections.sort(...)。
就像这样
Collections.sort(myList, new FunkyComparator());使用以下命令:
class FunkyComparator implements Comparator {
private static Map<String,Integer> orderedExceptions =
new HashMap<String,Integer>(){{
put("PREFZ", Integer.valueOf(1));
put("PREFA", Integer.valueOf(2));
}};
public int compare(Object o1, Object o2) {
String s1 = (String) o1;
String s2 = (String) o2;
Integer i1 = orderedExceptions.get(s1);
Integer i2 = orderedExceptions.get(s2);
if (i1 != null && i2 != null) {
return i1 - i2;
}
if (i1 != null) {
return -1;
}
if (i2 != null) {
return +1;
}
return s1.compareTo(s2);
}
}https://stackoverflow.com/questions/3110265
复制相似问题