Java8。使用收集器将值列表分组为范围列表

阿图罗·冈萨雷斯(Arturo Gonzalez)

我需要你的帮助,

在使用收集器分组的Java 8中,我需要将这样的列表分组

ValueObject {id=1, value=2.0}
ValueObject {id=2, value=2.0}
ValueObject {id=3, value=2.0}
ValueObject {id=4, value=3.0}
ValueObject {id=5, value=3.0}
ValueObject {id=6, value=4.0}
ValueObject {id=7, value=4.0}
ValueObject {id=8, value=4.0}
ValueObject {id=9, value=4.0}
ValueObject {id=10, value=4.0}

在另一个这样的

GroupedObject {from=1, to=3, value=2.0}
GroupedObject {from=4, to=5, value=3.0}
GroupedObject {from=6, to=10, value=4.0}

这些是我正在使用的对象的定义

public class ValueObject {

  private int id;
  private double value;

  public String getId() {
    return id;
  }

  public float getValue() {
    return value;
  }

  public void setValue(float value) {
    this.value = value;
  }

}

public class GroupedObject {

    private int from;
    private int to;
    private double value;

    public int getFrom() {
        return from;
    }

    public void setFrom(int from) {
        this.from = from;
    }

    public int getTo() {
        return to;
    }

    public void setTo(int to) {
        this.to = to;
    }

    public double getValue() {
        return value;
    }

    public void setValue(double value) {
        this.value = value;
    }

}

这就是我以编程方式进行的方式。

public class Service {

    public List<GroupedObject> groupToRange(List<ValueObject> list) {

        List<GroupedObject> filtered = new ArrayList<>();

        if (list.size() > 0) {

            ValueObject current = list.get(0);
            GroupedObject dto = new GroupedObject();
            dto.setValue(current.getValue());
            dto.setFrom(current.getId());

            for (int i = 0; i < list.size(); i++) {
                ValueObject vo = list.get(i);
                if (vo.getValue() != current.getValue()) {

                    dto.setTo(current.getId());
                    filtered.add(dto);

                    dto = new GroupedObject();
                    dto.setValue(vo.getValue());
                    dto.setFrom(vo.getId());
                    current = vo;

                } else {
                    current = vo;
                }
                if (i == list.size() - 1) {
                    dto.setTo(vo.getId());
                    filtered.add(dto);
                }
            }
        }
        return filtered;
    }

}

这是单元测试

public class ServiceTest {

    Service service = new Service();

    @Test
    public void testgGoupToRange() {

        List entryList = new ArrayList<>();

        entryList.add(new ValueObject(1, 2.0));
        entryList.add(new ValueObject(2, 2.0));
        entryList.add(new ValueObject(3, 2.0));
        entryList.add(new ValueObject(4, 3.0));
        entryList.add(new ValueObject(5, 3.0));
        entryList.add(new ValueObject(6, 4.0));
        entryList.add(new ValueObject(7, 4.0));
        entryList.add(new ValueObject(8, 4.0));
        entryList.add(new ValueObject(9, 4.0));
        entryList.add(new ValueObject(10, 4.0));

        List responseList = service.groupToRange(entryList);

        responseList.forEach(obj-> System.out.println(obj.toString()));

        assertNotNull(responseList);
        assertEquals(3, responseList.size());

    }

}

我还没有找到一种方法来处理Java 8和收集器

桂西姆

这是我想出的

List<ValueObject> values = Arrays.asList(new ValueObject(1, 2.0),
                                         new ValueObject(2, 2.0),
                                         new ValueObject(3, 3.0),
                                         new ValueObject(4, 4.0),
                                         new ValueObject(5, 4.0),
                                         new ValueObject(6, 4.0));
Map<Double, IntSummaryStatistics> groupedValues = values.stream()
                                                        .collect(Collectors.groupingBy(ValueObject::getValue,
                                                                                       Collectors.summarizingInt(ValueObject::getId)));

List<GroupedObject> groupedObjects = groupedValues.entrySet()
                                                  .stream()
                                                  .map(groupedValue -> new GroupedObject(groupedValue.getValue().getMin(),
                                                                                  groupedValue.getValue().getMax(),
                                                                                  groupedValue.getKey()))
                                                  .collect(Collectors.toList());
System.out.println(groupedObjects);

我非常有信心可以避免这种中介,Map<Double, IntSummaryStatistics但是我还没有弄清楚。如果我会更新。

编辑:1答案请参阅@Tunaki的答案。

这是输出

[GroupedObject{from=4, to=6, value=4.0}, GroupedObject{from=1, to=2, value=2.0}, GroupedObject{from=3, to=3, value=3.0}]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Java 8-如何使用流收集器对地图列表进行分组和求和

我可以在Java中使用收集器从文档列表中查找键值为最大值的文档吗?

Java 8使用流和收集器映射到集合的子列表条目

使用收集器根据Java中的类将流拆分为列表

使用 Java 8 流和收集器嵌套值

Java - Java8 中的 JVM 垃圾收集器

Java8,是否有过滤收集器?

Java8:使用IntStream作为自定义收集器的Supplier参数

使用自定义收集器进行Java 8分组?

java8流收集不同的列表

Java 8流列表收集器内存分配速度与带预分配的循环

Java groupingBy收集器是否保留列表顺序?

使用linq将收集列表转换为分组的收集列表

如何使用收集器进行分组

使用Groovy收集闭包将列表处理为分组的子列表

Java8计数收集器以及其他信息

错误简化方法和Java8中按ID排序-收集器

如何在Java8收集器中控制流程?

Java8流收集器.ToMap方法参考失败

Java 8流:条件收集器

使用收集器收集元素时如何合并列表/集合

如何使用流将Collectors.groupingby收集器创建的列表的元素映射到其他类型?

使用Java8流API将函数列表应用于值

收集器基于对象的属性创建列表列表

使用 Java8 仅对列表的前几个值求和

Java 8流收集器-用于使用多个存储桶中的对象创建映射的收集器

Java 8 Stream:通过多个收集器进行分组

使用java8将列表转换为地图

使用 Java8 将列表转换为地图