当前位置: 首页 > 面试题库 >

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

高博涉
2023-03-14
问题内容

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

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

如果您开始添加更多的前缀以进行过滤或排序,那么该解决方案肯定无法很好地扩展,因为您必须不断更新过滤器和每个前缀的权重。



 类似资料:
  • 问题内容: Python通过按顺序查看元组的元素来对元组列表进行排序。由于集合是无序的,Python如何对集合列表进行排序? 编辑:帖子中的问题和可接受的答案较为笼统,给出的文件也很深入。我的问题不是重复的。 问题答案: 无论列表中有什么内容,元素的方法都是唯一参考的比较方法。对于集合,意味着“是”的适当子集,不足以定义总顺序。这就是为什么结果通常是不确定的。可能是原始列表的任何排列,与实现恰好适

  • 所以我正在使用日期列表,其中一些值是""即null。我使用了如何在使用集合排序时处理空值Java答案 以两种升序对列表进行排序,将空放在第一位。 我想要的是按升序排列,先有空值,然后像上面的代码一样按升序排列。然后当选择降序来翻转列表时。列表中的第一个值是按降序排列的,然后是所有的空值。 在我按照集合的升序对列表排序后,我尝试了以下操作。反转顺序() 首先保留空值,然后按降序排列日期。 我还尝试了

  • 我有一个来自以下用户的消息列表: 我想从这个消息对象列表中计数并显示。有代码帮助吗?

  • 问题内容: 在Java程序中,我有一个要基于特定属性过滤的bean列表。 例如,假设我有一个Person列表,一个JavaBean,其中Person具有许多属性,其中包括“名称”。 我也有一个名字列表。 现在,我想查找姓名在姓名列表中的所有人员。 使用Google Guava执行此过滤器的最佳方法是什么? 到目前为止,我已经考虑过将Guava与Apache beanutils结合使用,但这似乎并不

  • 问题内容: 我有以下表格(为简单起见,省略了其他表格)。1适用于所有人,2适用于这些人从事的运动。我正在使用php允许用户查看人员列表。他们可以按人的名字或参加的体育活动进行过滤。因此,我希望能够看到所有参加比赛的人,例如棒球和足球。 基本上,我的问题是,如何使用people_to_sports获得所有参加运动1和运动2的人的列表? 我在这里有一个sqlfiddle 。 谢谢! 问题答案:

  • 问题内容: 我有一组三个列表项,它们希望在页面加载时从高到低自动显示。理想情况下使用jquery或javascript。 每个列表项都需要有自己的ID,因为它们每个都有各自的背景图像。数字必须是文本节点,以便用户可以编辑它们。 问题答案: 这可能是最快的方法,因为它不使用jQuery: 像下面这样调用函数: 您可以以相同的方式对其他列表进行排序,如果列表类在同一页面上还有其他元素,则应给您的ul一