使用Google集合过滤和排序列表

har*_*are 27 java sorting filter guava

假设我有一个列表(或Set):

List<String> testList = Lists.newArrayList("assocX","srcT","destA","srcX", "don't care Y", "garbage", "srcB");
Run Code Online (Sandbox Code Playgroud)

我想找回一个ImmutableList(Set),它按照自然顺序对术语进行排序/分组,其中以"src"开头的术语是第一个,"assoc"第二个和"dest"最后一个.如果术语不包含那些术语,则应从结果列表中删除它.

因此,这里的结果是"srcB","srcT","assocX","destA".

我想我可以通过Iterables.filter或Predicates的某些组合来做到这一点,但只是没有看到它.我认为必须有一种简洁的方法.

编辑:代替列表的集合也可以.

Pau*_*ing 33

只要这三个前缀是你唯一关心的事情,我建议这样的事情:

    Predicate<String> filter = new Predicate<String>() {
        @Override
        public boolean apply(String input) {
            return input.startsWith("src") || input.startsWith("assoc") || input.startsWith("dest");
        }
    };

    Function<String, Integer> assignWeights = new Function<String, Integer>() {
        @Override
        public Integer apply(String from) {
            if (from.startsWith("src")) {
                return 0;
            } else if (from.startsWith("assoc")) {
                return 1;
            } else if (from.startsWith("dest")) {
                return 2;
            } else {
                /* Shouldn't be possible but have to do something */
                throw new IllegalArgrumentException(from + " is not a valid argument");
            }
        }
    };

    ImmutableList<String> sortedFiltered = ImmutableList.copyOf(
            Ordering.natural().onResultOf(assignWeights).sortedCopy(
                    Iterables.filter(testList, filter)
            )
    );
Run Code Online (Sandbox Code Playgroud)

如果您开始添加更多前缀来过滤或排序,这个解决方案绝对不会非常好地扩展,因为您必须不断更新过滤器和每个前缀的权重.

  • 在其他情况下,最好"抛出新的IllegalArgumentException()"而不是"返回3". (11认同)

ext*_*eon 12

请查看此Google收藏集示例.

Function<Fruit, String> getNameFunction = new Function<Fruit, String>() {
    public String apply(Fruit from) {
        return from.getName();
    }
};

Ordering<Fruit> nameOrdering = Ordering.natural().onResultOf(getNameFunction);

ImmutableSortedSet<Fruit> sortedFruits = ImmutableSortedSet.orderedBy(
    nameOrdering).addAll(fruits).build();
Run Code Online (Sandbox Code Playgroud)

尽管如此,诚然,这会返回一个Set.