filter and sort list using google collections

前端 未结 4 920
被撕碎了的回忆
被撕碎了的回忆 2020-12-23 12:08

Suppose I have a list (or Set):

List testList = Lists.newArrayList(\"assocX\",\"srcT\",\"destA\",\"srcX\", \"don\'t care Y\", \"garbage\", \"sr         


        
4条回答
  •  太阳男子
    2020-12-23 12:50

    As long as those three prefixes are the only things you care about, I'd suggest something like this:

        Predicate filter = new Predicate() {
            @Override
            public boolean apply(String input) {
                return input.startsWith("src") || input.startsWith("assoc") || input.startsWith("dest");
            }
        };
    
        Function assignWeights = new Function() {
            @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 sortedFiltered = ImmutableList.copyOf(
                Ordering.natural().onResultOf(assignWeights).sortedCopy(
                        Iterables.filter(testList, filter)
                )
        );
    

    This solution definitely wouldn't scale out incredibly well if you start adding more prefixes to filter out or sort by, since you'd have to continually update both the filter and the weight of each prefix.

提交回复
热议问题