В java есть что-то такое же быстрое, как это? (быстрая кодировка)
int [] a = {1..99};
или я должен пойти на это:
int [] a=new int[100];
for (int i=0;i <100;++i){
a[i]=i;
}
В java есть что-то такое же быстрое, как это? (быстрая кодировка)
int [] a = {1..99};
или я должен пойти на это:
int [] a=new int[100];
for (int i=0;i <100;++i){
a[i]=i;
}
Из любопытства я проверил производительность двух версий этого метода - одна с циклом, а другая с использованием гуавы:
public int[] loop() {
int[] a = new int[100];
for (int i = 0; i < 100; ++i) {
a[i] = i;
}
return a;
}
public int[] guava() {
Set<Integer> set = ContiguousSet.create(Range.closed(0, 99), DiscreteDomains.integers());
int[] a = Ints.toArray(set);
return a;
}
Вот результаты:
Benchmark Mean Mean error Var Units
loop 79.913 5.671 30.447 nsec/op
guava 814.753 46.359 2034.726 nsec/op
Таким образом, метод guava guava()
выполняется за 814 нс + / - 46 нс против 80 нс + / - 5 нс для метода loop()
. Так что loop()
примерно в 10 раз быстрее. Если вы вызываете этот метод несколько раз, 800 наносекунд не имеют значения, если вы вызываете его очень часто, написание цикла, вероятно, лучше.
Так как Java 8 возможно:
int[] a = IntStream.range(1, 100).toArray();
(И короче, чем другой ответ java 8).
Java 8 позволяет сделать это в одной строке с IntStream
объектом и выражением лямбда:
int n = 10;
int[] values = new int[n];
IntStream.range(1,n+1).forEach(val -> values[val-1] = val);
Другая альтернатива, если вы используете Java 8:
int[] array = new int[100];
Arrays.setAll(array, i -> i + 1);
Лямбда-выражение принимает индекс ячейки и возвращает значение, которое помещается в эту ячейку. В этом случае ячейкам 0 - 99 присваиваются значения 1-100.
в зависимости от размера, который вам нужно будет зацикливать, если его небольшой, вы можете сделать следующее...
int[] intArray = new int[] {4,5,6,7,8};
im, угадывая ваш размер, вы не хотите набирать его все, поэтому имеет смысл создать цикл и установить его таким образом
Вы должны использовать цикл для инициализации такого длинного массива. На Java не существует метода ярлыков, как вы ожидали.
Вы можете использовать библиотеку Guava для чего-то вроде этого:
public class Test {
public static void main(String[] args) {
//one liner
int[] array = toArray(newLinkedList(concat(range(1, 10), range(500, 1000))));
//more readable
Iterable<Integer> values = concat(range(1, 10), range(500, 1000));
List<Integer> list = newLinkedList(values);
int[] array = toArray(list);
}
public static List<Integer> range(int min, int max) {
List<Integer> list = newLinkedList();
for (int i = min; i <= max; i++) {
list.add(i);
}
return list;
}
}
Обновлено: полный пример из этого сообщения Заполните массивы с диапазонами чисел
Я думаю, что ваш код является кратчайшим и простейшим способом. Вам может не понадобиться загружать дополнительные библиотеки, чтобы получить более "компактные" строки кода. Контуры для очень просты (действительно O (n)) и разборчивы, живут и любят их.