Public void setValoresAleatorios ( ) //preenche o array com valores inteiros aleatórios no intervalo [-50 , 100)

Como posso fazer esse método, colocando números negativos no array?

A classe indicada é a Random, entretanto, como o método que gera números inteiros, está limitado ao conjunto dos números naturais, você pode usar o Random para gerar um boolean aleatório.
Assim, ao combinar os dois, você tem a sua necessidade atendida.
Vide exemplo:

    public static void main(String[] args) {
        int[] vetor = new int[50];
        Random r = new Random();        
        for (int i = 0; i < vetor.length; i++) {
            vetor[i] = r.nextBoolean() ? -r.nextInt(51): r.nextInt(101);
        }
        System.out.println("Desordenado:\n"+Arrays.toString(vetor));
        Arrays.sort(vetor);
        System.out.println("Ordenado facilita visualização do range: \n"+Arrays.toString(vetor));
    }
1 curtida

vetor[i] = r.nextInt(50) * (r.nextBoolean() ? 1 : -1); não entendi essa linha do código

vetor[i]: percorrendo cada index do vetor;
r.nextInt(50), gera um inteiro positivo aleatório até 49: alterei o range para 51, cobrindo o 50;
r.nextBoolean(), gera um boolean aleatório para ser usado como teste de um o operador ternário ( ? : )
Quando o boolean aleatório é true, multiplica o inteiro gerado por 1.
Quando o boolean aleatório é false, multiplica o inteiro gerado por -1.
Como ví uma inconsistência no range, gerei outra codificação para atender ao proposto.

   public static void main(String[] args) {
        int[] vetor = new int[50];
        Random r = new Random();
        
        for (int i = 0; i < vetor.length; i++) {
            int val = (r.nextBoolean() ? 1 : -1);
            vetor[i] = r.nextInt(val == -1? 51 : 101)* val;
        }
        System.out.println("Desordenado:\n"+Arrays.toString(vetor));
        Arrays.sort(vetor);
        System.out.println("Ordenado facilita visualização do range: \n"+Arrays.toString(vetor));
    }

Definindo o intervalo em um ArrayList, entretanto, teria que reservar memória para o array.

public static void main(String[] args) {
        //gerando o range solicitado
        ArrayList<Integer> range = new ArrayList<>(IntStream.rangeClosed(-50, 100).boxed().collect(Collectors.toList()));
        Random r = new Random();
        int[] vetor = new int[50];
        for (int i = 0; i < vetor.length; i++) {
            vetor[i] = range.get(r.nextInt(range.size()));//pesquisa aleatória dentro do ArrayList range
        }
        System.out.println(Arrays.toString(vetor));
    }

Só tem como fazer com arraylist ?

Se você puder criar um array novo:

int quantidade = 10;
int minimo = -50;
int maximo = 100;
int[] numeros = new Random().ints(minimo, maximo).limit(quantidade).toArray();

Se tiver que preencher um array já existente:

public static void main(String[] args) {
    int quantidade = 10;
    int[] numeros = new int[quantidade];
    preencher(numeros, -50, 100);
}

public static void preencher(int[] dst, int min, int max) {
    Random r = new Random();
    for (int i = 0; i < dst.length; i++)
        dst[i] = min + r.nextInt(max - min);
}
1 curtida

esse encadeamento de métodos já vai criar um array de dez indices com números aleatórios de -50 a 100? Se é isso, eu achei que esse encadeamento de métodos que vc fez é muitooo legal :smiley:


E quanto a esse encademanto de métodos abaixo:

ArrayList<Integer> range = new ArrayList<>(IntStream.rangeClosed(-50, 100).boxed().collect(Collectors.toList()));

Isso cria um ArrayList<Integer> contendo o que? Esse ArrayList terá uma quantidade de índices limitada e fixa? E o que é:

  • A classe IntStream?
  • O método rangeClosed()?
  • O método boxed()?
  • O método collect()?
  • A classe Collectors?
  • O método toList()?

Parece ser outro encadeamento de métodos bem legal :slight_smile:

Onde você aprendeu esses encadeamentos e essas classes e métodos? Na documentação mesmo ou em livros?

Só não gostei no seu código da var “int[] dst”, o que é dst? Pra mim esse nome de variável é muito obscuro :confused:

Sim, é a “nova” (já não tão nova) API de streams do Java 8.

IntStream é uma stream de int, inteiros primitivos. rangeClosed é um método estático dessa classe que retorna uma stream de inteiros primitivos partindo do primeiro argumento até o segundo (inclusivo, por isso o closed). boxed é um método dessa classe que retorna uma stream de Integer, o objeto que representa inteiros. collect é um método que converte a stream para algum objeto do seu interesse. Nesse caso, ele é convertido para uma List, porque o Collectors.toList() é utilizado. Você pode criar seu próprio collector e transformar a stream no que você quiser.

Java 8 in Practice

É um nome bem comum que se dá à parâmetros de funções desse tipo.

  • src = source, fonte, origem
  • dst (ou dest) = destination, destino, alvo
1 curtida