Você está na página 1de 42

LDM 1

Programação Multimédia

3. Estruturas de Dados

Consultar Shi man, Caps. 9 e 23



Exercícios: Cap.3 de “Compilação de Exercícios”
ff
LDM Programação Multimédia Estruturas de Dados 2

Estruturas de Dados

• Estáticas:

• Têm tamanho xo (capacidade xa)

• Exemplo: arrays


• Dinâmicas:

• Têm tamanho variável (capacidade pode aumentar/diminuir)

• Exemplo: ArrayLists
fi
fi
LDM Programação Multimédia Estruturas de Dados 3

Estruturas Estáticas: Arrays

• Unidimensionais:

• Listas ordenadas de elementos.



Ex: int a [ ] = new int[12];

0 1 2 3 4 a.length-1

a:

a.length
LDM Programação Multimédia Estruturas de Dados 4

Estruturas Estáticas: Arrays

• Bidimensionais:

• Grelhas ordenadas de elementos.



Ex: int a[ ][ ] = new int[6][4];

a[2][0]

a: 0 1 2 3 a.length-1
0

1
a[0].length

a[0].length-1

a.length a[3][2]
Consultar Shi man, Cap. 9
ff
LDM Programação Multimédia Estruturas de Dados 5

Estruturas Dinâmicas: ArrayList

• Criada com uma capacidade inicial (pode ser nula)

• Podemos acrescentar novos elementos

• Podemos eliminar elementos

lista.size()-1
0 1
lista

lista.size()

Consultar Shi man, Cap. 23


ff
LDM Programação Multimédia Estruturas de Dados 6

ArrayList de objetos

Inicialmente vazia
• Criação:

• ArrayList<Classe> lista = new ArrayList();

Classe dos elementos da lista

lista.size()-1
0 1
lista

lista.size()
LDM Programação Multimédia Estruturas de Dados 7

Principais métodos
boolean add(Classe o) Appends the specified element to the end of this list.

void add(int index, Classe o) Inserts the specified element at the specified position in this list.

void clear() Removes all of the elements from this list.

boolean contains(Classe o) Returns true if this list contains the specified element.

Class get(int index) Returns the element at the specified position in this list.

int indexOf(Classe o) Returns the index of the first occurrence of the specified element in this
list, or -1 if this list does not contain the element.
boolean isEmpty() Returns true if this list contains no elements.

Class remove(int index) Removes the element at the specified position in this list.

boolean remove(Classe o) Removes the first occurrence of the specified element from this list, if it
is present.
int size() Returns the number of elements in this list.

void trimToSize() Trims the capacity of this ArrayList instance to be the list's current size.

* Ver mais em: https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html


LDM Programação Multimédia Estruturas de Dados 8

Exemplo: método add( )

• Criar uma ArrayList com 10 objetos de uma classe Bola com construtor
Bola(float x, float y, float d, color cor

ArrayList <Bola> b = new ArrayList();

void setup() {
(…)
for(int i = 0; i<10; i++)
b.add(new Bola(random(100,400), random(100,400), 15, color(0));
(…)

• Adicionar elemento na última posição da lista:

• lista.add(obj);

LDM Programação Multimédia Estruturas de Dados 9

Exemplo: método get( )

• Mostrar conteúdo da lista na janela:

void draw(){
background(255);
for(int i = 0; i < b.size(); i++){
b.get(i).desenha();
b.get(i).step();
}
}

• Obter elemento na posição i da lista:

• obj = lista.get(i);

LDM Programação Multimédia Estruturas de Dados 10

Exemplo mais completo

ArrayList <Bola> b = new ArrayList();


// Adiciona bolas brancas premindo rato
void setup() { void mousePressed() {
size(500,500); b.add(new Bola(mouseX,mouseY, 15,
for(int i = 0; i<10; i++) color(255)));
b.add(new Bola(random(100,400), }
random(100,400), 15, color(0));
} // Apaga todas as bolas
void keyPressed() {
void draw(){ if (key == ' ')
background(255); b.clear();
for(int i = 0; i < b.size(); i++){ }
b.get(i).desenha();
b.get(i).step();
}
}

LDM Programação Multimédia Estruturas de Dados 11

Variemos a forma como desenhamos as bolas


ArrayList <Bola> b = new ArrayList();
int d = 25, distH = 40, maxB, proxCor = 0;
color[] cores = {color(0), color(255,0,0), color(255,255,0), color(0,255,0),
color(0,255,255), color(0,0,255), color(255)};

void setup() {
adiciona 3 bolas
size(500,500);
for(int i = 0; i<3; i++) {
b.add(new Bola(0, height/2, d, cores[proxCor]));
proxCor++;
}

void draw(){
background(255);
for(int i = 0; i < b.size(); i++){
b.get(i).x = (i+1)*distH;
b.get(i).desenha();
}
}

LDM Programação Multimédia Estruturas de Dados 12

Uma forma de adicionar bolas


void keyPressed() {
if (key >= '0' && key <= '9') {
int k = key - '0';
if (k <= b.size()) {
b.add(k, new Bola(0, height/2, d, cores[proxCor]));
proxCor = (proxCor+1) % cores.length;
}
}
}

premir tecla 1 premir tecla 4 premir tecla 0

LDM Programação Multimédia Estruturas de Dados 13

Os elementos de uma arrayList são objetos

• Como criar ArrayLists de int, oat, boolean, char, etc?

• Exemplo para inteiros:

• ArrayList<Integer> lista = new ArrayList( )

• Adicionar um inteiro na última posição da lista:

• lista.add(34)

• Adicionar um inteiro na primeira posição da lista:

• lista.add(0, 53);
;

fl
;

LDM Programação Multimédia Estruturas de Dados 14

Exemplo:
ArrayList <Integer> a = new ArrayList();

void setup() {
size(500,500);
for(int i = 0; i<5; i++) {
a.add(round(random(width)));
}

void draw() {
background(255);
ll(0);
int passo = round(height/(a.size()+1));
// primeira bolinha
circle(a.get(0), passo, 5);
//Restantes bolinhas e linhas
for(int i = 1; i<a.size(); i++) {
circle(a.get(i), (i+1)*passo, 5);
line(a.get(i), (i+1)*passo, a.get(i-1), i*passo);
}
}

fi

LDM Programação Multimédia Estruturas de Dados 15

Outros métodos

• Veri car se elemento existe na lista:


lista.size()-1
0 1
• if (lista.contains(2)) { … lista

lista.size()
• Posição de um elemento na lista:

• int i = lista.indexOf(obj); // i é a posição de obj na lista; se não existir, i = -1

• Apagar elemento na posição i:

• lista.remove(1); // apaga elemento na posição 1


fi
}

LDM Programação Multimédia Estruturas de Dados 16

Uma classe

• A classe PVector (pré-de nida) pode ser usada para representar pontos num plano:

• x —> coordenada em x

• y —> coordenada em y

• Construtor: PVector(float x, float y)

• Criar ponto: PVector p = new PVector(40, 20);

• Mais tarde voltaremos a esta classe para a explorarmos com mais atenção.
fi
LDM Programação Multimédia Estruturas de Dados 17

Listas de posições (pontos)

ArrayList<PVector> lista = new ArrayList();

// adiciona duas posições


PVector p1 = new PVector(3,3);
lista.add(p1);
PVector p2 = new PVector(0,1);
lista.add(p2);

alternativa

// adiciona duas posições


lista.add(new PVector(3,3));
lista.add(new PVector(0,1));

LDM Programação Multimédia Estruturas de Dados 18

Mostrar conteúdo de listas de posições

void printlist(ArrayList<PVector> lista) {


for(int i=0; i<lista.size(); i++)
print("(" + lista.get(i).x+ ", " + lista.get(i).y+ ") ");
println( );
}

Conteúdo mostrado no terminal


LDM Programação Multimédia Estruturas de Dados 19

Mais sobre listas de posições


ArrayList<PVector> lista1 = new ArrayList();
ArrayList<PVector> lista2 = new ArrayList();

// adiciona quatro posições a lista 1


PVector p1 = new PVector(3,3);
lista1.add(p1); // insere posição (3,3)
PVector p2 = new PVector(0,1);
lista1.add(p2); // insere posição (0,1)
PVector p11 = p1.copy();
p11.add(p2);
lista1.add(p11); // insere posição (3,4)
print("lista1:" );
printlist(lista1);

// adiciona duas posições a lista 2


PVector p3 = new PVector(0,2);
lista2.add(p3); // insere posição (0,2)
terminal:

lista2.add(p11); // insere posição (3,4)


print("lista2:" ); lista1:(3.0, 3.0) (0.0, 1.0) (3.0, 4.0)

printlist(lista2); lista2:(0.0, 2.0) (3.0, 4.0)


LDM Programação Multimédia Estruturas de Dados 20

Exemplo

• Resolver usando ArrayList de objetos?


LDM Programação Multimédia Estruturas de Dados 21

Uma solução com arrays (IPRP)

reta 0 reta 1 reta i

p[0] p[2] p[2*i] p[2*i+1]

reta i
LDM Programação Multimédia Estruturas de Dados 22

Uma solução com arrays (IPRP)

int nlinhasmax = 20 void draw()


int[ ] x = new int[nlinhasmax*2] background(255);
int[ ] y = new int[nlinhasmax*2] for (int i=0; i<p; i++)
int p = 0 fill(0)
circle(x[i],y[i],5)
void setup () if (i%2 != 0
size(500,500) line(x[i-1],y[i-1],x[I],y[i])

void mousePressed()
if(p < nlinhasmax*2) void keyPressed()
x[p] = mouseX if (keyCode == ' ')
y[p] = mouseY; p=0
p++

} Podíamos pensar numa solução com arrays


bidimensionais… Como seria?
}

LDM Programação Multimédia Estruturas de Dados 23

Uma solução com array de objetos PVector

reta 0 reta 1 reta i

pt

p[0] p[2] p[2*i] p[2*i+1]

reta i
LDM Programação Multimédia Estruturas de Dados 24

Uma solução com array de objetos PVector

int nlinhasmax = 20 void draw()


PVector[ ] pt = new PVector[nlinhasmax*2] background(255);
int p = 0 for (int i=0; i<p; i++)
fill(0)
void setup () circle(pt[i].x, pt[i].y, 5)
size(500,500) if (i%2 != 0
line(pt[i-1].x, pt[i-1].y, pt[I].x, pt[i].y)

void mousePressed()
if(p < nlinhasmax*2)
pt[p] = new PVector(mouseX, mouseY); void keyPressed()
p++ if (keyCode == ' ')
p=0
} }
}

LDM Programação Multimédia Estruturas de Dados 25

Uma solução com ArrayList de objetos PVector

reta 0 reta 1 reta i

ArrayList pt

pos 0 pos 2 pos 2*i pos 2*i+1

reta i
LDM Programação Multimédia Estruturas de Dados 26

Uma solução com ArrayList de objetos PVector

void draw()
ArrayList<PVector> pt = new ArrayList() background(255);
for (int i=0; i < pt.size(); i++)
void setup () fill(0)
size(500, 500) circle(pt.get(i).x, pt.get(i).y, 5)
if (i%2 != 0
line(pt.get(i-1).x, pt.get(i-1).y
void mousePressed() pt.get(i).x, pt.get(i).y)
pt.add(new PVector(mouseX, mouseY))
}

void keyPressed()
if (keyCode == ' ')
pt.clear()
}
}

LDM Programação Multimédia Estruturas de Dados 27

Cuidados a ter na remoção de elementos

• Exemplo usando a classe Bola:

ArrayList <Bola> b = new ArrayList()

void setup()
size(500,500)
for(int i = 0; i<100; i++
b.add(new Bola(random(width),
random(height), 25, color(200))

void draw()
background(255)
stroke(255,0,0)
line(0, height/2, width, height/2)
stroke(0)
for(int i = 0; i < b.size(); i++)
b.get(i).desenha()

}
}

LDM Programação Multimédia Estruturas de Dados 28

Cuidados a ter na remoção de elementos

• Consideremos agora o seguinte código:

void mousePressed()
for (int i=0; i<b.size(); i++
if(b.get(i).y > height/2
b.remove(i)
}

• O que se espera que aconteça?

• O que acontece realmente?

Não era bem isto, pois não?

Algumas bolas não foram apagadas…


;

LDM Programação Multimédia Estruturas de Dados 29

Onde está o problema?

• Apagar verdes:
0 1 2 3 4 5 6 7 8 9

i i i

0 1 2 3 4 5 6 7 8

i
0 1 2 3 4 5 6 7

i
Ficou por apagar!
LDM Programação Multimédia Estruturas de Dados 30

Solução:

• Inverter o sentido do ciclo:

void mousePressed()
for (int i=b.size()-1; i>=0; i--
if(b.get(i).y > height/2
b.remove(i)
}

Agora, já apaga tudo


;

LDM Programação Multimédia Estruturas de Dados 31

Estruturas Dinâmicas: Dicionários

Dicionário
Chave Valor

Key 1 Value 1

Key 2 Value 2

Key 3 Value 3

… …

Key n Value n

normalmente são strings


LDM Programação Multimédia Estruturas de Dados 32

Dicionários: a classe IntDict

• Permite criar dicionários com valores inteiros

• Construtor:

• IntDict dic = new IntDict( );

• Adicionar entrada:

• dic.set("farinha", 38);

• Remover entrada:

• dic.remove("farinha");
LDM Programação Multimédia Estruturas de Dados 33

Classe IntDict: alguns métodos

Métodos Funcionalidade
void set(String key, Integer value) Adiciona novo par chave/valor, ou altera valor de par existente
int get(String key) Devolve valor associado à chave
int size( ) Devolve número de pares do dicionário
String [ ] keyArray( ) Devolve cópia do array de chaves interno
String [ ] valueArray( ) Devolve cópia do array de valores interno
boolean hasKey(String key) Verifica se a chave existe no dicionário
void increment(String key) Incrementa valor associado a uma chave
void remove(String key) Remove par com a chave dada
void clear( ) Apaga todos os pares existentes
void sortKeys( ) Ordena chaves alfabeticamente
void sortKeysReverse( ) Ordena chaves alfabeticamente por ordem inversa
void sortValues( ) Ordena por valores crescentes
void sortValuesReverse( ) Ordena por valores decrescentes
LDM Programação Multimédia Estruturas de Dados 34

Exemplo 1:

IntDict inventory

void setup()
size(200, 200)
inventory = new IntDict()
inventory.set("cds", 84)
inventory.set("livros", 15) Adiciona pares
inventory.set("vinis", 102)
println("Inicial: "+inventory)

if (inventory.hasKey("vinis"))
println("Sim, temos “ + inventory.get(“vinil”) + “ vinis.");
} else
println("Desculpe, não temos vinis.")

Inicial: IntDict size=3 { "cds": 84, "livros": 15, “vinis": 102 }

Sim, temos vinis.


}

LDM Programação Multimédia Estruturas de Dados 35

Exemplo 2:

IntDict inventory

void setup()
size(200, 200)
inventory = new IntDict()
inventory.set("cds", 84)
inventory.set("livros", 15)
inventory.set("vinis", 102)
println("Inicial: "+inventory)

inventory.remove("livros")
println("Final: "+inventory); Remove par
}

Inicial: IntDict size=3 { "cds": 84, "livros: 15, "vinis": 102 }

Final: IntDict size=2 { "cds": 84, “vinis": 102 }


{

LDM Programação Multimédia Estruturas de Dados 36

Exemplo 3:

IntDict inventory

void setup()
size(200, 200)
inventory = new IntDict()
inventory.set("cds", 84)
inventory.set("livros", 15)
inventory.set("vinis", 102)
println("Inicial: "+inventory)

inventory.set("cds", 8)
println("Final: "+inventory); Altera valor
println("cds: "+ inventory.get("cds"));
}

Inicial: IntDict size=3 { "cds": 84, "livros": 15, "vinis": 102 }

Final: IntDict size=3 { “cds": 8, "livros": 15, "vinis": 102 }

cds: 8
{

LDM Programação Multimédia Estruturas de Dados 37

Exemplo 4:

IntDict inventory

void setup()
size(200, 200)
inventory = new IntDict()
inventory.set("cds", 84)
inventory.set("livros", 15)
inventory.set("vinis", 102)

String[] theKeys= inventory.keyArray()


int[] theValues = inventory.valueArray()
for (int i=0; i<theKeys.length; i++
println(theKeys[i]+" "+theValues[i])
}

cds 84

livros 15

vinis 102
{

LDM Programação Multimédia Estruturas de Dados 38

Dicionários: a classe StringDict

• Permite criar dicionários com strings

• Construtor:

• StringDict dic = new StringDict( );

• Adicionar entrada:

• dic.set("farinha", “branca");

• Remover entrada:

• dic.remove("farinha");
LDM Programação Multimédia Estruturas de Dados 39

Classe StringDict: alguns métodos


Métodos Funcionalidade
void set(String key, String value) Adiciona novo par chave/valor, ou altera valor de par existente

String get(String key) Devolve valor associado à chave

int size( ) Devolve número de pares do dicionário

String [ ] keyArray( ) Devolve cópia do array de chaves interno

String [ ] valueArray( ) Devolve cópia do array de valores interno

boolean hasKey(String key) Verifica se a chave existe no dicionário

void remove(String key) Remove par com a chave dada

void clear( ) Apaga todos os pares existentes

void sortKeys( ) Ordena chaves alfabeticamente

void sortKeysReverse( ) Ordena chaves alfabeticamente por ordem inversa

void sortValues( ) Ordena valores alfabeticamente

void sortValuesReverse( ) Ordena valores alfabeticamente por ordem inversa


LDM Programação Multimédia Estruturas de Dados 40

Exemplo 5:

StringDict loja

void setup()
size(200, 200)
loja = new StringDict()
loja.set("farinha", "branca")
loja.set("cafe", "preto")
loja.set("alface", "verde")
loja.set("manteiga", "amarela")

loja.sortKeys() Ordena por chaves


String[] theKeys = loja.keyArray()
String[] theValues = loja.valueArray()
for (int i=0; i<theKeys.length; i++
println(theKeys[i]+" "+theValues[i])
} alface verde

cafe preto

farinha branca

manteiga amarela
{

LDM Programação Multimédia Estruturas de Dados 41

Exemplo 6:
balada_da_neve.txt

IntDict dicP = new IntDict()


String texto = “balada_da_neve.txt”
String[] linhas, palavras

void setup()
linhas = loadStrings(texto)
for (int i=0; i<linhas.length; i++)
palavras = splitTokens(linhas[i], " ,.?:")
for (int p=0; p<palavras.length; p++
if(dicP.hasKey(palavras[p])
dicP.increment(palavras[p]) Conta ocorrências
else dicP.set(palavras[p], 1)
Ordena

dicP.sortValuesReverse()
String[] pals = dicP.keyArray() (val. decrescentes) é ocorre 4 vezes

for (int i=0; i<5; i++)


println(pals[i]+" ocorre " nem ocorre 3 vezes

dicP.get(pals[i])+" vezes") chuva ocorre 3 vezes

}
Será ocorre 2 vezes

se ocorre 2 vezes
Mostra 5 mais frequentes
}

LDM Programação Multimédia

Você também pode gostar