加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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的自然顺序排序,然后断开与对象本身的自然顺序的关系.

也许凌乱,但很有趣.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读