1

这是场景,我有每月数据,我必须将其插入数据结构然后检索它。所以说数据a进入一月,数据b进入六月,数据c进入一月。插入完成后,我添加给定月份的所有数据并检索它。所以对于一月,它将是 a+b,对于二月,它可能是 d+e+f,依此类推。我怎样才能在 Java 中做到这一点?请帮忙。谢谢马特

4

3 回答 3

3

使用 12 个条目的 Array/ArrayList 怎么样?

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 个总和。

于 2013-06-14T19:11:43.767 回答
0

如果你要一个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);

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

于 2013-06-14T19:57:07.873 回答
0

Month枚举、EnumMap和函数流

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

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

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

将空ArrayList<Integer>值作为每个键的值。ArrayList只能容纳对象 ( ) ,Integer不能容纳基元 ( int)。幸运的是,自动装箱会自动为我们来回转换。

// 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 ) );

循环播放

循环遍历每个键,获取每个键的列表。如果列表为空,请跳过它(或者您可以报告零)。如果不为空,则循环添加列表中元素的值。再次,自动装箱来拯救对象↔原始转换。

对于报告,我们要求Month枚举对象以英语、法语等方式为该月生成一个本地化名称。

// 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 中的函数式方法,使用 Java Streams 来计算聚合在此处此处此处讨论了其他问题。

// 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 );
    }
}
于 2018-04-19T05:33:09.190 回答