2014-09-13 3 views
2

Я ищу самый простой способ создать диапазон лет, который я могу внести в список, начиная с года и заканчивая в конце года.Создайте диапазон лет от начала до конца.

Пример

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

ожидая, чтобы создать список лет ["2010","2011","2012","2013","2014"]

Нет, я знаю, что нужно, чтобы преобразовать строку в Integer

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

Оттуда я потерял в для наиболее эффективного способа завершить это.

+3

подсчет будет хорошим местом для начала. –

+0

Вы задумываетесь о том, чтобы зацикливаться и увеличиваться до тех пор, пока не нажмете на гору? –

+0

Да, это ничем не отличается от вывода чисел от 0 до 10. Ваши начальные и конечные условия просто разные. –

ответ

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; 
} 
+0

Как насчет исключения NumberFormatException, которое Integer.parseInt() выбрасывает? –

+0

@HunterMcMillen Что с этим делать? Если вы используете это исключение, вы не следуете рекомендациям [изложенным в документации.] (Http://docs.oracle.com/javase/7/docs/api/java/lang/Integer. HTML # ParseInt% 28java.lang.String% 29) –

3

Вы не должны создавать такую ​​специфическую функцию, которая принимает строки, обычно лучше иметь функцию диапазона, которая принимает ints и преобразовывает строки с использованием 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's Range, они хороши, потому что, используя итераторы, им не нужно физически создавать экземпляр списка.

+0

Я не могу дождаться, чтобы попробовать java 8 Спасибо за вашу помощь. –

1

Treat Дата как дата

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

Вот каково это с новым API-интерфейсом Java 8 streams. Я буду считать, что нет никакого смысла случай, когда либо год может быть 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()); 

шаги примерно соответствуют: обеспечить fromYear и toYear являются не- null, иначе выведите исключение; конвертировать fromYear и toYear в целые числа; создать поток значений int, начинающийся с fromYear и заканчивающийся toYear; конвертировать их в Integer экземпляров (это boxed()); и упаковать их в список.

Смежные вопросы