Como inicializar todos os elementos de um array para qualquer valor específico em java

108

Em C/C++nós temos uma memset()função que pode cumprir meu desejo, mas em Javacomo posso inicializar todos os elementos com um valor específico? Sempre que escrevemos int[] array=new int[10];, isso simplesmente inicializa um array de tamanho 10 com todos os elementos iguais a zero. Eu só quero alterar este inteiro de inicialização para um dos meus array. ou seja, eu quero inicializar um array que tenha todos os elementos iguais a -1. Caso contrário, tenho que colocar um forloop logo após a inicialização, que varia de índice 0a índice size-1e dentro desse loop, estou atribuindo elemento a -1. Abaixo está o código para mais compreensão-

    int[] array = new int[10];
    for (int i = 0; i < size; i++) {
        array[i] = -1;
    }

Eu estou indo correto? Existe alguma outra maneira de fazer o mesmo?

Ravi Joshi
fonte

Respostas:

212

Se for um tipo primitivo, você pode usar Arrays.fill():

Arrays.fill(array, -1);

[A propósito, memsetem C ou C ++ só tem uso real para matrizes de char. ]

Oliver Charlesworth
fonte
17
Eu verifiquei o código-fonte de Arrays.fill(). Ele faz a mesma coisa. public static void fill(int[] a, int val) { for (int i = 0, len = a.length; i < len; i++) a[i] = val; }
Ravi Joshi
2
Sim. Como deveria ser. Embora eu suspeite que o JIT pode ser inteligente o suficiente para melhorar a implementação básica.
Louis Wasserman,
1
Discordo. memsettambém pode ser usado, e de fato é muito útil, em matrizes de inteiros quando você precisa preencher 0ou -1, por exemplo, em problemas de DP.
Sнаđошƒаӽ
@ Sнаđошƒаӽ - Não de forma portátil.
Oliver Charlesworth,
1
Apenas um FYI: você pode usar memset_pattern4, 8 e 16 para outros tamanhos inteiros.
geowar
32

Há também

int[] array = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Gilbert Le Blanc
fonte
12
E se o tamanho da matriz for desconhecido?
Abhishek kumar de
5

Também é possível com fluxos Java 8:

int[] a = IntStream.generate(() -> value).limit(count).toArray();

Provavelmente, não é a maneira mais eficiente de fazer o trabalho, no entanto.

Alexey
fonte
Isso também funcionaria para tipos não primitivos ( Stream.generate(() -> new Whatever("Hello World", 42)).limit(count).toArray();), portanto, é mais flexível do que Arrays.fill (). Não tenho certeza sobre a eficiência, porém, como você diz.
Christopher Riches
3

Você pode fazer isso se for curto:

int[] array = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};

mas isso é ruim para mais do que apenas alguns.

Mais fácil seria um forloop:

  int[] myArray = new int[10];
  for (int i = 0; i < array.length; i++)
       myArray[i] = -1;

Edit: Eu também gosto da Arrays.fill()opção que outras pessoas mencionaram.

Danation
fonte
existe alguma disposição para inicializar uma matriz bidimensional? algo como int a [] [] = new int [3] [4]; Arrays.fill (a, -1); de modo que todos os 12 elementos serão definidos com -1.
PoornaChandra
1

Você já tentou a função Arrays.fill ?

Sam Goldberg
fonte
Não. Eu não usei antes.
Ravi Joshi
Você poderia dar um exemplo de como isso poderia ser?
Aenadon
@Aenadon: veja a resposta aceita que mostra a função Arrays.fill.
Sam Goldberg
0

Você pode usar Arrays.fill(array, -1).


fonte
0

Evidentemente, você pode usar Arrays.fill (), mas a maneira como você fez isso também funciona.

Renuz
fonte
Ya. Even Arrays.fill()usa um forloop com índice 0para size-1. Da mesma forma, o que eu fiz. Obrigado pela sua resposta.
Ravi Joshi,
0

Usando Java 8, você pode simplesmente usar ncopiesde Collectionsclasse:

Object[] arrays = Collections.nCopies(size, object).stream().toArray();

No seu caso, será:

Integer[] arrays = Collections.nCopies(10, Integer.valueOf(1)).stream().toArray(Integer[]::new);
.

Aqui está uma resposta detalhada de um caso semelhante seu.

hd84335
fonte
0

Para listas, você pode usar

Collections.fill(arrayList, "-")

Mohan Munisifreddy
fonte