java – 列出排序难题
发布时间:2020-12-15 04:52:40 所属栏目:Java 来源:网络整理
导读:假设我有 final IterableString unsorted = asList("FOO","BAR","PREFA","ZOO","PREFZ","PREFOO"); 我该怎么做才能将这个未排序的列表转换为: [PREFZ,PREFA,BAR,FOO,PREFOO,ZOO] (以必须首先出现的已知值开头的列表(此处为“PREFA”和“PREFZ”),其余按字母
假设我有
final Iterable<String> unsorted = asList("FOO","BAR","PREFA","ZOO","PREFZ","PREFOO"); 我该怎么做才能将这个未排序的列表转换为: [PREFZ,PREFA,BAR,FOO,PREFOO,ZOO] (以必须首先出现的已知值开头的列表(此处为“PREFA”和“PREFZ”),其余按字母顺序排序) 我认为guava中有一些有用的类可以完成这项工作(Ordering,Predicates ……),但我还没有找到解决方案…… 解决方法
你特别提到了番石榴;与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","PREFOO"); Collections.sort(values,Ordering.natural().nullsLast().onResultOf(POSITION_IN_KNOWN_INDEXES).compound(Ordering.natural()) ); 换句话说,按List.indexOf()返回的Integer的自然顺序排序,然后断开与对象本身的自然顺序的关系. 也许凌乱,但很有趣. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |