gpt4 book ai didi

java - 使用谷歌 Collection 过滤和排序列表

转载 作者:IT老高 更新时间:2023-10-28 21:14:47 25 4
gpt4 key购买 nike

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

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

我想取回一个 ImmutableList(Set),它按自然顺序对术语进行排序/分组,其中以“src”开头的术语排在第一位,“assoc”排在第二位,“dest”排在最后。如果一个术语不包含这些,则应将其从结果列表中删除。

因此这里的结果是“srcB”、“srcT”、“assocX”、“destA”。

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

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

最佳答案

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

    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)
)
);

如果您开始添加更多前缀来过滤或排序,此解决方案肯定不会很好地扩展,因为您必须不断更新过滤器和每个前缀的权重。

关于java - 使用谷歌 Collection 过滤和排序列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2312849/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com