首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >列表排序难题

列表排序难题
EN

Stack Overflow用户
提问于 2010-06-24 21:18:30
回答 6查看 701关注 0票数 3

假设我有

代码语言:javascript
运行
复制
final Iterable<String> unsorted = asList("FOO", "BAR", "PREFA", "ZOO", "PREFZ", "PREFOO");

我可以做些什么将这个未排序的列表转换成这个列表:

代码语言:javascript
运行
复制
[PREFZ, PREFA, BAR, FOO, PREFOO, ZOO]

(该列表以必须首先出现的已知值开头(此处为"PREFA“和"PREFZ"),其余值按字母顺序排序)

我认为在芭乐中有一些有用的类可以完成这项工作(排序、谓词……),但我还没有找到解决方案……

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-06-25 05:38:50

你特别提到了芭乐;除了Sylvain M的答案,还有另一种方式(更多的是作为一种学术练习和芭乐灵活性的演示)

代码语言:javascript
运行
复制
// 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的自然顺序进行排序,然后断开与对象本身的自然顺序的关系。

凌乱,也许,但有趣。

票数 1
EN

Stack Overflow用户

发布于 2010-06-24 21:43:10

我会保持不同的列表。

一个用于已知值和未知值。并分别对它们进行排序,当您需要将它们放在一个列表中时,您可以将它们连接起来。

代码语言:javascript
运行
复制
knownUnsorted.addAll(unsorted.size - 1, unknonwUnsorted);
票数 3
EN

Stack Overflow用户

发布于 2010-06-24 21:54:27

我建议使用您的值填充List并使用Collections.sort(...)

就像这样

代码语言:javascript
运行
复制
Collections.sort(myList, new FunkyComparator());

使用以下命令:

代码语言:javascript
运行
复制
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);
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3110265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档