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

Java 集合 - 计算总大小,然后不使用添加重复记录 使用 Java 8 [已关闭]

井嘉胜
2023-03-14

想改进这个问题吗?通过编辑这篇文章添加细节并澄清问题。

存储容器中大约有500万记录。我需要在集合对象中获取它们。我得到以下列表:

[
    {"Record1":"Java","Version":"6","Size":"56"},
    {"Record2":"Java","Version":"6","Size":"58"},
    {"Record3":"Java","Version":"6","Size":"46"},
    {"Record4":"Java","Version":"6","Size":"56"},
    {"Record5":"Java","Version":"6","Size":"29"},
    {"Record6":"Python","Version":"3.8","Size":"15"},
    {"Record7":"Python","Version":"3.8","Size":"20"},
    {"Record8":"Python","Version":"3.8","Size":"23"},
    {"Record9":"Python","Version":"3.8","Size":"32"},
    {"Record10":"Python","Version":"3.8","Size":"31"}   
]

预期结果(需要计算特定“版本”的总大小):

[
    {"Record1":"Java","Version":"6","Size":"245"},
    {"Record2":"Python","Version":"3.8","Size":"121"}
]

“Java”的总尺寸示例:

"56""58""46""56""29"="245"

如何使用Java 8实现这一点?

共有1个答案

充培
2023-03-14

首先,您应该谨慎行事,并考虑将大量记录加载到java应用程序时的内存和网络i/o需求
尝试在存储容器中进行计算。

至于java代码,您可以使用以下代码:

import lombok.Data;

import java.util.Arrays;
import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class StackoverflowQuestion {
    @Data
    static class Row {
        private final Info info;
        private final Integer size;
    }

    @Data
    static class Info {
        private final String platform;
        private final String version;
    }

    public static void main(String[] args) {
        List<Row> rows = Arrays.asList(
            new Row(new Info("Java", "8"), 10),
            new Row(new Info("Java", "8"), 20),
            new Row(new Info("Java", "11"), 30),
            new Row(new Info("Java", "11"), 40),
            new Row(new Info("Python", "3.3"), 50),
            new Row(new Info("Python", "3.3"), 60),
            new Row(new Info("Python", "3.8"), 70)
        );

        Map<Info, IntSummaryStatistics> collect = rows.stream()
            .collect(Collectors.groupingBy(Row::getInfo, // Info class will be the key
                Collectors.mapping(Row::getSize, // what to do with Size?
                    Collectors.summarizingInt(Integer::intValue)))); // sum it

        collect.forEach((key, value) -> System.out.println(key + ": " + value.getSum()));
        
        // output:
        // Info(platform=Python, version=3.8): 70
        // Info(platform=Java, version=11): 70
        // Info(platform=Python, version=3.3): 110
        // Info(platform=Java, version=8): 30
    }
}

隆伯克。这里的数据用作所有参数构造函数equals、hashCode和toString的快捷方式。equals,分组需要hashCode。

 类似资料:
  • 一个存储容器中大约有500万条记录。我需要在一个集合对象中获取它们。我得到了下面的列表: 预期结果(需要计算特定“版本”的总大小): “Java”的总尺寸示例: "56" "58" "46" "56" "29"="245" 如何使用Java 8实现这一点?

  • 问题内容: 在我重新发明这个特殊的轮子之前,是否有人有一个很好的例程来使用Python计算目录的大小?如果例程以Mb / Gb等格式很好地格式化大小,那将是非常好的。 问题答案: 这遍历所有子目录;总结文件大小: 还有一个使用os.listdir进行娱乐的oneliner ( 不包括子目录 ): 参考: os.path.getsize-以字节为单位给出大小 步行 os.path.islink 已更

  • Java标准库中的大多数集合(如ConcurrentLinkedQueue、Concurrent LinkedDequeue和ConcurrntSkipListSet)的文档都附带以下免责声明: 注意,与大多数集合不同,size方法不是一个恒定时间的操作。由于这些集合的异步性质,确定元素的当前数量需要遍历元素,因此如果在遍历过程中修改了集合,可能会报告不准确的结果。 那是什么意思?为什么他们不能保

  • 我正在运行一个要提交的scala Spark应用程序vi spark-submit: 我已经尝试了我能想到或在这里找到的log4j的几乎所有配置,这里,这里,这里和这里等等。我在代码中添加了以下行: 总之,我可以更改这些设置中的任何一个,并且应用程序打印出日志级别的设置,但是无论如何,我从Spark获得了日志记录的MBs。 关于如何禁用Spark的所有详细日志记录,还有其他建议吗?

  • 问题内容: 我正在尝试计算光盘上文件的大小。在Java的7本可以用做Files.walkFileTree如图我的答案在这里。 但是,如果我想使用java-8流来执行此操作,则它将适用于某些文件夹,但不适用于所有文件夹。 上面的代码可以很好地用于路径,但是会抛出以下异常 我了解它的来源以及如何使用Files.walkFileTree API避免它。 但是如何使用Files.walk() API 避免

  • 我希望在另一个函数中使用此函数。这个“addTotal”函数的作用是返回某个客户的每个银行账户的总余额。我通过插入“return total对账单,它只获取第一个银行账户的余额。对此有什么建议吗?