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

如何在java中添加特定月份的数据

益明朗
2023-03-14

这里是一个场景,我有每月的数据,我必须将其插入到数据结构中,然后检索它。假设数据a进入一月,数据b进入六月,数据c进入一月。插入完成后,我添加给定月份的所有数据并检索它。因此,1月份可能是a b,2月份可能是d e f等等。如何在Java中实现这一点?请帮忙。谢谢Matt

共有3个答案

史默
2023-03-14

现代方法使用java.time类、Map,甚至可能使用JavaStreamsJava的功能方面。

月枚举定义了十几个对象,一年中每个月一个。使用枚举映射(EnumMap)作为您的映射(Map),因为它针对枚举作为键进行了高度优化。

Map < Month, List < Integer > > map = new EnumMap( Month.class );

放置一个空的数组列表

// Pre-populate.
for ( Month m : EnumSet.allOf( Month.class ) ) {
    map.put( m , new ArrayList <>() );
}

// Add some data.
List < Integer > list;

list = map.get( Month.FEBRUARY );
list.addAll( List.of( 1 , 2 , 3 ) );

list = map.get( Month.MAY );
list.addAll( List.of( 44 , 22 ) );

循环遍历每个键,获取每个键的列表。如果列表为空,请跳过它(或者可以报告零)。如果不为空,则循环添加列表中元素的值。再一次,自动拳击拯救目标↔原语转换。

对于报告,我们要求enum对象以英语、法语或其他语言为该月份生成本地化名称。

// Report
for ( Month m : map.keySet() ) {
    list = map.get( m );
    if ( ! list.isEmpty() ) {
        int sum = 0;
        for ( Integer integer : list ) {
            sum = ( sum + integer );
        }
        System.out.println( m.getDisplayName( TextStyle.FULL , Locale.US ) + " = " + sum );
    }
}

二月=6

可能=66

我们可以使用Java中的函数方法来代替循环,使用JavaStreams来计算聚合。在这里、这里和这里讨论了其他问题。

// Report
for ( Month m : map.keySet() ) {
    list = map.get( m );
    if ( ! list.isEmpty() ) {
        int sum = list.stream().mapToInt( Integer :: intValue ).sum();
        System.out.println( m.getDisplayName( TextStyle.FULL , Locale.US ) + " = " + sum );
    }
}
郭建华
2023-03-14

如果您要求Map,您可以尝试这样的操作:

// Month enum.
enum Month {JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC}

// Map for storing months against values.
Map<Month, Double> monthMap = new HashMap<Month, Double>();

// Initialize month map with 0.0 value. You may implement it differently.
void initMonthMap() {
    for (Month m : Month.values())  {
        monthMap.put(m, 0.0);
    }
}

// Function to add values to a month.
void addValue(Month m, Double v)    {
    monthMap.put(m, monthMap.get(m) + v); 
}

// Eg. Adding values to a month.
addValue(Month.JAN, 12.0);

之后,您可以获取任何/每个月的汇总值。

俞衡虑
2023-03-14

使用一个包含12个条目的数组/数组列表如何?

ArrayList<ArrayList<Double>> data = new ArrayList<>(12);

您需要初始化它:

for (int i = 0; i < 12) {
    data.add(new ArrayList<Double>());
}

然后,您可以通过以下方式添加数据:

data.get(month - 1).add(123.);

请注意,索引以0开头。

警告:基本体对象集合的缩放效果不佳。他们需要的内存比需要的多得多。如果您有大量数据,使用GNU-Trove可能会很快得到回报。

但是,如果您只想对它们求和,可以这样做:

 double[] sums = new double[12];

 sums[month - 1] += value;

马上计算12个和。

 类似资料:
  • 问题内容: 如何知道特定年份的特定月份有多少天? 问题答案: Java 8及更高版本 @沃伦·诺科斯(Warren M. 如果你尝试使用Java 8的新Date and Time API,则可以使用java.time.YearMonthclass。请参阅Oracle教程。 测试:尝试a年的一个月: Java 7及更早版本 创建日历,设置年份和月份并使用 getActualMaximum 测试:尝试

  • 问题内容: 我想在JavaScript中添加几个月的日期。 例如:我要插入日期(格式),现在我要在此日期前加上8个月。我希望结果是。 因此,增加月份时,年份也可能增加。 问题答案: 已于2019年6月25日更正: 旧

  • 问题内容: 我将数据保存在SQLite数据库中。我将日期保存为DATETIME数据类型在数据库中。 我只想从我的SQLite数据库中检索特定月份的数据。 我尝试使用下面的查询来检索数据,但是它没有用。它给了我数据,但不是特定月份。 问题答案: 这可能不是最佳选择,但您可以使用:

  • 问题内容: 我想在用户输入的结束日期前加上2个月。如何在结束日期前加上2个月并显示呢? 任何帮助表示赞赏。谢谢! 问题答案: 您需要获取增加数月的业务规则。简单的解决方案是: 但是,这将从7月31日更改为9月31日,并将转换为10月1日。同样,1月31日加上1个月是2月31日,根据是否是leap年,它将转换为3月2日或3月3日。 您可能希望第一次是9月30日,第二次是2月28日或29日(取决于是否

  • 问题内容: 我需要在python中计算给定月份的天数。如果用户输入2011年2月,则该程序应能够告诉我2011年2月为28天。任何人都可以告诉我应该使用哪个库来确定给定月份的时长。 问题答案: 用途: 需要明确的是,它也支持years年: 正如@ mikhail-pyrev在评论中提到的那样: 第一个数字是该月第一天的工作日,第二个数字是所述月份中的天数。

  • 我想在CardView上显示一个特定的月份,而不使用下一个和上一个箭头来导航日历。如果我想显示2010年2月,用户只能看到2010年2月。他们下个月或上个月不能去。 我遵循这个堆栈溢出答案来显示一个特定的月份,但它对我不起作用。它始终显示我的病例的当前日期和月份。我不确定是否可以禁用上一次导航。 我的XML: 我的片段类: 如果没有下一个导航,我如何只显示2月份?