当前位置: 首页 > 知识库问答 >
问题:

如何用java迭代每n个元素?

充运浩
2023-03-14

我有一个名为计算的方法,它需要太长时间才能完成。所以我决定将我的信息列表对象部分发送到这个方法。我如何遍历每n个元素?

public static void main(String [] args){
    Map<String, Long> info....;  //my info Map

    //I want to call method like 
    for(int i = 0; i<info.size(); i+=5)
       calculate(info.submap(i,i+5)); 
}


public static boolean calculate(Map<String, Long> info){
    //Some calculations

}

共有2个答案

牧甫
2023-03-14

听起来您想要做的是对<code>映射所表示的数据实现一种批处理

private static <T> Stream<Stream<T>> createBatchStreams(final Iterator<T> iter, final int maxBatchSize) {
    final Stream.Builder<Stream<T>> resultBuilder = Stream.builder();
    {
        // NOTE: This logic could also be encapsulated in a Collector class
        // in order to make it less imperative style
        Stream.Builder<T> currentBatchBuilder = Stream.builder();
        int currentBatchSize = 0;

        while (iter.hasNext()) {
            final T next = iter.next();
            if (currentBatchSize == maxBatchSize) {
                resultBuilder.add(currentBatchBuilder.build());
                // Start building a new batch
                currentBatchBuilder = Stream.builder();
                currentBatchSize = 0;
            }
            currentBatchBuilder.add(next);
            currentBatchSize++;
        }
        // Check if there is a non-empty Stream to add (e.g. if there was a
        // final batch which was smaller than the others)
        if (currentBatchSize > 0) {
            resultBuilder.add(currentBatchBuilder.build());
        }
    }
    return resultBuilder.build();
}

使用这种方法,您可以创建一个批量地图数据的生成器,然后将这些数据提供给< code>calculate(...)函数(尽管签名略有不同):

public static void main(final String[] args) {
    final Map<String, Long> info = LongStream.range(0, 10).boxed()
            .collect(Collectors.toMap(value -> "key" + value, Function.identity())); // Test data
    final Stream<Stream<Entry<String, Long>>> batches = createBatchStreams(info.entrySet().iterator(), 5);
    batches.forEach(batch -> {
        calculate(batch);
        // Do some other stuff after processing each batch
    });
}

private static boolean calculate(final Stream<Entry<String, Long>> info) {
    // Some calculations
}
孟开宇
2023-03-14

您可以使用以下代码

class SomeClass {

    private final int BUFFER_SIZE = 5;    

    public static void main(String[] args) {
        Map<String, Long> info = new HashMap<>();

        LongStream.range(0, 30).boxed().forEach(i -> info.put("key" + i, i)); // for test

        IntStream.range(0, info.size() / BUFFER_SIZE)
                .boxed()
                .parallel()
                .map(i -> Arrays.copyOfRange(info.keySet().toArray(), BUFFER_SIZE * i, BUFFER_SIZE * (i + 1)))
                .map(Arrays::asList)
                .map(keys -> info.entrySet().stream()
                        .filter(x -> keys.contains(x.getKey()))
                        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)))
                .forEach(SomeClass::calculate);
    }

    public static boolean calculate(Map<String, Long> info) {
        System.out.println("calculation for " + info.toString());
        return true;
    }
}
 类似资料:
  • 给定一个数字字符串,我想在字符串中的每n位数应用一个操作。这可能与java流? 例如,对于字符串,并对每2个字符应用3的和,结果将是。 上面的结果是,因为总和应用于所有字符。

  • 如何才能做到这一点呢? 谢谢大家。

  • 问题内容: 您能想到一种很好的方法(也许使用itertools)将迭代器拆分为给定大小的块吗? 因此,with成为迭代器 我可以想到一个小程序来做到这一点,但是使用itertools并不是一个好方法。 问题答案: 在 从配方文件的食谱来靠近你想要什么: 但是,它将使用填充值填充最后一个块。 较不通用的解决方案仅适用于序列,但可以根据需要处理最后一个块 最后,一种可在一般迭代器上运行且其行为符合预期

  • 我正在尝试学习java流。我能够进行简单的迭代/过滤/映射/收集等。 当我尝试收集每 3 个元素并打印时,如本例所示,[收集每 3 个元素并打印等等......] 输出: 我没有得到任何线索,如何使用流做到这一点。我应该实现自己的收集器来实现这一点吗?

  • 我有一个LinkedHashMap,它有一个值(在调试器上检查),但是当我试图使用它作为每个组件的输入时,它抛出了这个错误: 这是我为每个人准备的片段: 非常确定负载不是null和空的,并且是HashMap的实例。我错过什么了吗?谢谢

  • 问题内容: 我正在研究一个难题,其中涉及分析所有大小的k个子集,并找出哪个子集是最佳的。我写了一个解决方案,当子集的数量很少时可以使用,但是对于较大的问题,它用尽了内存。现在,我正在尝试将用python编写的迭代函数转换为java,以便我可以在创建每个子集时对其进行分析,并仅获取代表其优化程度的值,而不是整个集的值,以便不会耗尽记忆。这是我到目前为止的内容,即使很小的问题也似乎还没有解决: 有人可