Introdução à linguagem scala - slides.jarley.comslides.jarley.com/pf/pf-06-scala-set-list.pdf ·...

25

Transcript of Introdução à linguagem scala - slides.jarley.comslides.jarley.com/pf/pf-06-scala-set-list.pdf ·...

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 27

Refazer o exercício 8, utilizando Map e/ou Set.

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

Forma alternativa

var A = List(1)

var B = List(2,1)

var C = 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

Exercício 30

Escreva uma função em Scala que recebe uma lista de números inteiros e retorna um Map, onde cada chave corresponde ao índice do elemento da lista e o valor é o próprio elemento.