从头到尾创建一系列年份。

时间:2014-09-13 17:48:23

标签: java

我正在寻找最简单的方法来创建一系列年份,我可以将这些年份放入列表中,从年份开始到结束年份结束。

示例

String fromYear = "2010"
String toYear = "2014"

期望创建年份列表["2010","2011","2012","2013","2014"]

不,我知道我需要将字符串转换为整数

Integer from = fromYear != null ? Integer.parseInt(fromYear) : null;
Integer to = toYear != null ? Integer.parseInt(toYear) : null;

从那里我失去了最有效的方式来完成这个。

4 个答案:

答案 0 :(得分:3)

你不应该创建一个带字符串的特定函数,通常最好有一个范围函数,它使用Integer.parseInt来填充和转换字符串,正如你在问题中所说的那样。

然后你可以定义自己的功能:

public static List<Integer> range(int from, int to) {
    List<Integer> list = new ArrayList<Integer>();
    for (int i = from; i <= to; ++i)
        list.add(i);
    return list;
}

否则,如果您使用的是Java 8,请查看IntStream.rangeClosed。你也可以使用Guava的Range,它们很好,因为使用迭代器,它们不必物理实例化列表。

答案 1 :(得分:3)

这就是使用新的Java 8流API的情况。我将假设没有任何用例,其中任何一年可能是null,如果其中一个是:

,则会抛出错误
String fromYear = "2010" ;
String toYear = "2014" ;

List<Integer> years =
        IntStream.rangeClosed
                (Integer.parseInt(Objects.requireNonNull(fromYear)),
                 Integer.parseInt(Objects.requireNonNull(toYear)))
        .boxed()
        .collect(Collectors.toList());

步骤大致对应于:确保fromYeartoYear都是非null,否则会抛出异常;将fromYeartoYear转换为整数;创建以int开头并以fromYear结尾的toYear值流;将它们转换为Integer个实例(即boxed());并将它们打包成一个列表。

答案 2 :(得分:2)

接受String个参数,转换并返回Integer列表:

public static List<Integer> range(String startYear, String endYear) {
    int cur = Integer.parseInt(startYear);
    int stop = Integer.parseInt(endYear);
    List<Integer> list = new ArrayList<Integer>();
    while (cur <= stop) {
        list.add(cur++);
    }
    return list;
}

或者如果您需要返回String列表:

public static List<String> range(String startYear, String endYear) {
    int cur = Integer.parseInt(startYear);
    int stop = Integer.parseInt(endYear);
    List<String> list = new ArrayList<String>();
    while (cur <= stop) {
        list.add(String.valueOf(cur++));
    }
    return list;
}

答案 3 :(得分:1)

将日期视为日期

String fromYear = "2010";
String toYear = "2014";
SimpleDateFormat df = new SimpleDateFormat("yyyy", Locale.ENGLISH);
List<String> listOfDates = new ArrayList();
Calendar startCal = Calendar.getInstance(Locale.ENGLISH);
startCal.setTime(df.parse(fromYear));
Calendar endCal = Calendar.getInstance(Locale.ENGLISH);
endCal.setTime(df.parse(toYear));
while (startCal.getTimeInMillis() <= endCal.getTimeInMillis()){
    java.util.Date date = startCal.getTime();
    listOfDates.add(new SimpleDateFormat("yyyy", Locale.ENGLISH).format(date).trim());
    startCal.add(Calendar.YEAR, 1);
}
System.out.println(listOfDates);