Sets
Em Scala é possível utilizar uma estrutura pré-definida para armazenar uma coleção de elementos diferentes do mesmo tipo.
Não existem elementos duplicados no conjunto Declaração: var y : Set[Int] = Set()
O tipo do conjunto não é obrigatório, podendo usar a inferência: var x = Set(1,3,5,7)
Sets
Operações com conjuntos: União e interseção
Exemplo:
var A = Set(1,3,5,10)
var B = Set(0,2,4,10)
A & B //interseção
A ++ B //união
A subsetOf B // retorna false
A.isEmpty // retorna false
A.contains(5) // retorna true
Sets
Atribuindo valores a um conjunto:
Exemplo: criar um conjunto com os 20 primeiros inteiros
var A : Set[Int] = Set()// Vazio
for (i<-1 to 20) A += i
Sets
Outras operações com conjuntos var nums= Set(1, 2, 3)
nums = nums + 5// Adiciona o elemento 5 ao conjunto
nums = nums - 3 // Remove o elemento 3 do conjunto
nums = nums ++ List(5, 6) // Adiciona uma lista de
elementos
nums = nums -- List(1, 2) // Remove uma lista de
elementos
nums.size // Retorna o tamanho do conjunto
nums.clear // Remove todos os elementos do conjunto
nums.foreach(println) // percorre e imprime os elementos
nums.foreach((i: Int) => println(i)) // idem
nums.foreach(sum += _) // soma os elementos e acumula na
variável sum
Exercício 24
Crie um programa em Scala que gera aleatoriamente 100 números inteiros e imprime as seguintes informações
A quantidade de números repetidos;
A quantidade de números pares únicos.
Exercício 25
Crie as seguintes funções em Scala, levando em consideração que todas recebem um parâmetro do tipo Set:
Retorna um novo conjunto contendo apenas os elementos pares;
Retorna um novo conjunto contendo apenas os números primos.
Exercício 26
Crie funções em Scala que recebem dois conjuntos (Set) como parâmetros e retornam as seguintes informações:
Um único conjunto contendo apenas os números pares existentes nos dois conjuntos;
Um único conjunto contendo apenas os números primos em comum aos dois conjuntos.
Hash Tables
Provê uma generalização de arrays.
Ao invés de um índice para acessar um elemento do array -> qualquer objeto pode ser usado como índice.
Restrição: os índices precisam ser do mesmo tipo
Em Scala uma hash table é do tipo Map.
Criando uma hash table vazia:
var A:Map[Char,Int] = Map()
// índice Char e elementos inteiros
Hash Tables
Inicializando uma hash table:
var A:Map[Char,Int] = Map()
A += ('A' -> 1)
A += ('B' -> 5)
A += ('C' -> 10)
A += ('D' -> 100)
// índice Char e elementos inteiros
Hash Tables
Inicializando uma hash table:
var cores= Map("vermelho" ->
"#FF0000","azul" -> "#F0FFFF")
cores+= ("indigo" -> "#4B0082")
println(cores.size) // imprime 3
Hash Tables
Método contains de Map:
if (!cores.contains("verde"))
println("Erro: \"verde\" não
existe!\n")
Hash Tables
Removendo um elemento de Map: cores -= "azul" Recuperando todas as chaves de uma hash table:
método keys:
cores.keys // Retorna uma coleção com as cores A coleção com as chaves pode ser percorrida com o
método foreach
Método foreach
Em Scala é possível percorrer os elementos de um array, set ou hash table usando a função anônima foreach
Esse método recebe uma função como argumento e invoca a mesma função para cada elemento da coleção.
Exemplo:
var A=Array(1,2,3,4,5,6,7,8,9,10) A.foreach((x:Int) => println(x))
// outra forma de usar o foreach com inferência
A.foreach(x=> println(x))
// Usando o foreach como função anônima
A.foreach(println)
Exercício 28
Crie uma função em Scala que recebe uma hash table com índice do tipo String e valor do tipo inteiro e retorna uma matriz Nx2. A primeira coluna da matriz corresponde a um índice e a segunda coluna, o seu valor correspondente na hash table.
Listas em Scala
A estrutura de dados mais importante de linguagens funcionais é a lista.
Definição:
Uma lista de objetos do tipo A consiste de um objeto head, seguido por uma lista de objetos tail.
Uma lista pode ser vazia, denotada pelo objeto Nil.
O método :: (pronuncia-se cons), constrói uma lista a partir de uma entidade e outra lista.
Equivale a inserir um objeto no início da lista
Listas em Scala
Exemplos de listas
var A = 1::Nil // List(1)
var B = 2::A // List(2, 1)
var C = 1::2::3::Nil // List(1, 2, 3)
Listas em Scala
Inserindo elementos em uma lista
var A:List[Int] = Nil // lista vazia
for(i<- 10 to 1 by -1) A = i::A
Forma alternativa
var A = List.range(10,1,-1)
Listas em Scala
Exemplo
O que é impresso ao final da execução do trecho abaixo?
var B:List[Int] = Nil
for(i<- 0 to 20 by 2) B = i::B
println(B)
Listas em Scala
Acessando elementos da lista Métodos head e tail
Acesso direto pelo índice (n>=0)
Exemplos var A = List(5,4,3,2,1)
println(A(4)) // imprime o elemento 1
A.Head // imprime o elemento 5
A.Tail // imprime List(4, 3, 2, 1)
Listas em Scala
Métodos úteis para manipulação de listas
var A = List(1,2,3,4,5)
take (sublista com os “n” primeiros elementos A take 2 // igual a List(1, 2)
drop (sublista excluindo os “n” primeiros elementos A drop 2 // igual a List(3, 4, 5)
split (retorna duas sublistas, a primeira com “n” elementos e a segunda com tamanho – n elementos) A splitAt 2 // igual a (List(1,
2),List(3, 4, 5))
Exercício 29
Escreva uma função recursiva em Scala para inserir de forma ordenada os elementos de uma lista.
Obs.: Utilizar apenas os métodos vistos anteriormente