这是一个场景,我有月度数据,我必须插入数据结构,然后检索它。 所以说数据a进入1月份,数据b进入6月份,数据c进入1月份。 插入完成后,我会添加给定月份的所有数据并检索它。所以对于Jan来说它将是+ b,对于2月它可能是d + e + f等等。我怎样才能在Java中实现这一目标?请帮助。 谢谢 马特
答案 0 :(得分: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个总和。
答案 1 :(得分: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);
稍后您可以获取任何/每月的总计值。
答案 2 :(得分:0)
Month
枚举,EnumMap
和功能流现代方法使用 java.time 类,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 );
}
}
2月= 6
5月= 66
我们可以使用Java Streams中的函数方法而不是循环来使用calculate an aggregate。讨论了其他问题,here和here以及here。
// 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 );
}
}