Java将两个不同大小的列表合并到HashMap

时间:2016-08-11 09:54:36

标签: java arraylist hashmap

我需要一些提示: 我可以用

表示一个列表或一系列年份
int startYear = 2010;
int endYear = 2050;

我有一个带字母和数字的枚举作为年份代码。

  

我需要这个用于条形码生成,其中我有一个时间戳需要编码成3位/字母,所以我需要将年月和日映射到代码位置。

我需要做的是将年序列映射到密钥的HashMap(年份数字)和值(年份代码),

但显然代码列表不像年份序列那么长,所以我需要检查何时到达最后一个索引,如果是,我需要重新遍历代码列表,直到达到年末序列。

我需要实现的是:

year    code
2012     C
2013     D
.
.
2030     Y
2031     1
.
.
2039     9
2040     A

依旧......

不幸的是我无法弄清楚如何做到这一点,对于我来说,我对java很陌生,所以如果有人能给我一些建议,我会很感激..

4 个答案:

答案 0 :(得分:1)

只需使用%运算符来计算代码索引

List years = ...
List codes = ...
for (int i = 0, yearsSize = years.size(), codesSize = codes.size(); i < yearsSize; i++) {
     map.put(years.get(i), codes.get(i % codesSize));
}

请参阅Remainder Operator (%)

答案 1 :(得分:0)

这样的事情怎么样?:
假设:

public enum Code {
    A, B, C, ... Z, 1, ... 9;
}
List<Integer> years;
HashMap<Integer,Code> map;

只需为代码添加一个索引,如果太大则会初始化:

int i = 0;
for(Integer year : years) {
    map.push(year, Code.values()[i];
    i++;
    if(i >= Code.values().length) {
        i = 0;
    }
}

答案 2 :(得分:0)

在对年份进行编码之前,年份有效,因此%year%循环:

2012

假设MyEnum encodedYear = MyEnum.values()[yearToEncode - 2012]; 是“零年”。

然后你可以使用:

MyEnum[] codes = MyEnum.values();
MyEnum encodedYear = codes[year % codes.length];

但如果零年是任意的话,你的代码会更简单:

{{1}}

答案 3 :(得分:0)

试试这个你甚至可以改变开始年份和结束年份

int yStart = 2010;
int yEnd = 2050;
String s  = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; 
int pos = 0;
for(int i = yStart; i < yEnd; i++){
    pos = (i - yStart)%s.length();
    map.put(i, s.substring(pos, pos+1));// put in map
    System.out.println(i + "  " + s.substring(pos, pos+1));

}