Есть ли что-либо как Счетный. Диапазон (x, y) в Java?

Есть ли что-то как C#/.NET's

IEnumerable<int> range = Enumerable.Range(0, 100); //.NET

в Java?

10
задан Tendayi Mawushe 1 June 2010 в 14:59
поделиться

2 ответа

В Java для этого нет встроенной поддержки, однако это очень легко собрать самостоятельно. По большому счету, API Java предоставляют все элементы, необходимые для такого рода функций, но не комбинируют их сразу же.

Java использует подход, согласно которому существует бесконечное количество способов комбинировать вещи, так что зачем отдавать предпочтение нескольким комбинациям над другими.С правильным набором строительных блоков можно легко построить все остальное (это тоже философия Unix).

API других языков (например, C # и Python) имеют более взвешенный взгляд, они выбирают несколько вещей, которые действительно упрощают, но все же допускают более эзотерические комбинации.

Типичный пример проблемы с подходом Java можно увидеть в библиотеке Java IO . Канонический способ создания текстового файла для вывода:

BufferedWriter out = new BufferedWriter(new FileWriter("out.txt"));

Библиотека ввода-вывода Java использует шаблон декоратора , который является действительно хорошей идеей для обеспечения гибкости, но, конечно, чаще всего вам нужен буферизованный файл? Сравните это с эквивалентом в Python, который делает типичный вариант использования очень простым:

out = file("out.txt","w")
3
ответ дан 3 December 2019 в 17:57
поделиться

Вы можете подклассифицировать Arraylist для достижения того же самого:

public class Enumerable extends ArrayList<Integer> {   
   public Enumerable(int min, int max) {
     for (int i=min; i<=max; i++) {
       add(i);
     }
   }    
}

Затем используйте итератор для получения последовательности целых чисел от min до max (оба включая)

EDIT

Как отметил sepp2k - решение выше быстрое, грязное и практичное, но имеет некоторые серьезные недостатки (не только O(n) в пространстве, тогда как должно быть O(1)). Для более серьезной эмуляции класса C# я бы лучше написал пользовательский класс Enumerable, реализующий Iterable и пользовательский итератор (но не здесь и не сейчас ;) ).

2
ответ дан 3 December 2019 в 17:57
поделиться