【问题标题】:Reorder elements in a Java stream对 Java 流中的元素重新排序
【发布时间】:2019-09-23 18:47:31
【问题描述】:

我有一个对象流,并希望实现一个规则,以确保流中的第一项不满足特定条件(例如,不是奇数)。我不想只是丢弃这些项目,我只想确保它们不在列表中的第一个。

如何使用 Java 流实现类似的功能?

【问题讨论】:

  • 我不认为这是一个非常有问题的定义。说...给定 [1,2,3,4,5,6,7,8] 你想要什么。 [2,4,6,8,1,3,5,7] 或 [2,1,3,4,5,6,7,8] 或其他东西
  • 如果索引很重要,您可能需要考虑使用 for 循环
  • @mavriksc 第二个列表(2,1,3,4...)
  • 检查答案并请更新

标签: java stream java-stream


【解决方案1】:

您可以使用比较器对流元素进行排序。此外,您可以通过调用方法firstComparator.thenComparing(secondComparator) 创建具有一些规则的比较器。见例子。对于输入,我们有数字:[2, 3, 4, 5, 7, 8, 9, 10]。对于输出,我们将有:[2, 4, 8, 10, 3, 9, 5, 7]。首先,我们输入偶数。然后我们把能被三整除的数字放进去。然后我们输入其他数字。

public static void main(String[] args) {
    List<Integer> sourceList = new ArrayList<>(Arrays.asList(2, 3, 4, 5, 7, 8, 9, 10));

    Comparator<Integer> firstComparator = new Comparator<Integer>() {
        @Override
        public int compare(Integer o1, Integer o2) {
            if (o1 % 2 == 0 && o2 % 2 == 0 || o1 % 2 != 0 && o2 % 2 != 0) {
                return 0;
            }
            if (o1 % 2 == 0) {
                return -1;
            }
            return 1;
        }
    };

    Comparator<Integer> secondComparator = new Comparator<Integer>() {
        @Override
        public int compare(Integer o1, Integer o2) {
            if (o1 % 3 == 0 && o2 % 3 == 0 || o1 % 3 != 0 && o2 % 3 != 0) {
                return 0;
            }
            if (o1 % 3 == 0) {
                return -1;
            }
            return 1;
        }
    };

    List<Integer> sortedList = sourceList
            .stream()
            .sorted(firstComparator.thenComparing(secondComparator)
            .collect(Collectors.toList());

    System.out.println(sortedList);
}

【讨论】:

    【解决方案2】:

    不确定这是否是一个很好的解决方案。但它会做你想做的事。 things 是一个列表,getNum() 访问您想要查看的功能是否为偶数。

    things.add(0,things.remove(things.indexOf(things.stream().filter(t-&gt;t.getNum()%2==0).findFirst().orElse(things.get(0)))));

    基本上过滤列表并找到第一个偶数属性元素并通过返回元素的索引将其删除,然后将其插入列表的头部。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-04
      • 2021-06-07
      • 2014-05-22
      • 1970-01-01
      • 2011-07-09
      相关资源
      最近更新 更多