Подтвердить что ты не робот

Кратчайший способ заполнения массива 1,2... n

В java есть что-то такое же быстрое, как это? (быстрая кодировка)

int [] a = {1..99};

или я должен пойти на это:

int [] a=new int[100];
for (int i=0;i <100;++i){
a[i]=i;
}
4b9b3361

Ответ 1

Из любопытства я проверил производительность двух версий этого метода - одна с циклом, а другая с использованием гуавы:

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 наносекунд не имеют значения, если вы вызываете его очень часто, написание цикла, вероятно, лучше.

Ответ 2

Так как Java 8 возможно:

int[] a = IntStream.range(1, 100).toArray();

(И короче, чем другой ответ java 8).

Ответ 3

Java 8 позволяет сделать это в одной строке с IntStream объектом и выражением лямбда:

int n = 10;
int[] values = new int[n];
IntStream.range(1,n+1).forEach(val -> values[val-1] = val);

Ответ 4

Другая альтернатива, если вы используете Java 8:

int[] array = new int[100];
Arrays.setAll(array, i -> i + 1);

Лямбда-выражение принимает индекс ячейки и возвращает значение, которое помещается в эту ячейку. В этом случае ячейкам 0 - 99 присваиваются значения 1-100.

Ответ 5

в зависимости от размера, который вам нужно будет зацикливать, если его небольшой, вы можете сделать следующее...

int[] intArray = new int[] {4,5,6,7,8};

im, угадывая ваш размер, вы не хотите набирать его все, поэтому имеет смысл создать цикл и установить его таким образом

Ответ 6

Вы должны использовать цикл для инициализации такого длинного массива. На Java не существует метода ярлыков, как вы ожидали.

Ответ 7

Вы можете использовать библиотеку 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;
}

}

Обновлено: полный пример из этого сообщения Заполните массивы с диапазонами чисел

Ответ 8

Я думаю, что ваш код является кратчайшим и простейшим способом. Вам может не понадобиться загружать дополнительные библиотеки, чтобы получить более "компактные" строки кода. Контуры для очень просты (действительно O (n)) и разборчивы, живут и любят их.