1.1k likes | 1.23k Views
Listas Ordenadas e Listas Classificadas. Sumário. Fundamentos Listas Ordenadas Listas Classificadas. Conceito de Listas. Listas são os containers mais simples que existem e também os mais versáteis.
E N D
Sumário • Fundamentos • Listas Ordenadas • Listas Classificadas
Conceito de Listas • Listas são os containers mais simples que existem e também os mais versáteis. • Consideradas como tipos abstratos de dados listas são séries de itens e permitem inclusão e exclusão de elementos e a visitação a itens na ordem em que aparecem.
Tipos especiais de Listas • Podem ser definidos dois tipos especiais de listas: • Listas ordenadas – são aquelas nas quais a ordem ou posição dos itens é relevante, independentemente de seu conteúdo e, portanto, pode ser modificada. • Listas classificadas – são listas ordenadas nas quais a ordem é inerente ao conteúdo dos itens e não pode ser modificada. • As abstrações destes tipos de listas são encontradas nas interfaces OrderedList e SortedList.
Fundamentos • Considerar-se-ão como fundamentos os padrões de Projeto e as Hierarquias de classe, ou Framework, de Bruno Preiis. • Em particular as interfaces • Comparable • Container • SearchableContainer
Interface Comparable public interface Comparable { boolean isLT (Comparable object); boolean isLE (Comparable object); boolean isGT (Comparable object); boolean isGE (Comparable object); boolean isEQ (Comparable object); boolean isNE (Comparable object); int compare (Comparable object); }
Interface Container public interface Container extends Comparable { int getCount(); boolean isEmpty(); boolean isFull(); void purge(); void accept(Visitor visitor); Enumeration getEnumeration(); }
Classe Abstrata AbstractContainer public abstract class AbstractContainer extends AbstractObject implements Container { protected int count; public int getCount() { return count; } public boolean isEmpty() { return getCount() == 0; } public boolean isFull() { return false; } // ... }
Interface SearchableContainer public interface SearchableContainer extends Container { boolean isMember(Comparable object); void insert(Comparable object); void withdraw(Comparable obj); Comparable find(Comparable object); }
Listas Ordenadas - Sumário • Introdução • Implementação sobre “Arrays” • Implementação sobre Listas Encadeadas
Introdução • As listas Ordenadas serão apresentadas por uma interface e duas classes correspondendo a dois tipos de implementação, sobre “arrays” e sobre listas encadeadas: • Interface OrderedList • Classe OrderedListAsArray • Classe OrderedListAsLinkedList
Interface OrderedList public interface OrderedList extends SearchableContainer { Comparable get (int i); Cursor findPosition (Comparable object); }
Interface OrderedList • Esta interface estende SearchableContainer e apresenta os métodos get e findPosition. Por sua vez SearchableContainer dispõe dos métodos: • insert • withdraw • find • isMember
Método findPosition de OrderedList • O método findPosition retorna um Cursor, cuja interface será exibida a seguir e que dispõe dos métodos: • getDatum • insertAfter • insertBefore • withdraw
Interface Cursor public interface Cursor { Comparable getDatum(); void insertAfter(Comparable object); void insertBefore(Comparable object); void withdraw(); }
Interface SortedList public interface SortedList extends SearchableContainer { Comparable get(int i); Cursor findPosition(Comparable object); }
Classe OrderedListAsArray public class OrderedListAsArray extends AbstractSearchableContainer implements OrderedList { protected Comparable[] array; // ... }
Construtor e método de inserção de item no final da lista public class OrderedListAsArray extends AbstractSearchableContainer implements OrderedList { protected Comparable[] array; public OrderedListAsArray(int size) { array = new Comparable [size]; } public void insert(Comparable object) { if(count == array.length) throw new ContainerFullException (); array[count] = object; ++count; } // ... }
Métodos isMember e find public class OrderedListAsArray extends AbstractSearchableContainer implements OrderedList { protected Comparable[] array; public boolean isMember(Comparable object) { for(int i = 0; i < count; ++i) if(array[i] == object) return true; return false; } public Comparable find(Comparable arg) { for(int i = 0; i < count; ++i) if(array[i].isEQ(arg)) return array[i]; return null; } // ... }
Método withdraw (1) public class OrderedListAsArray extends AbstractSearchableContainer implements OrderedList { protected Comparable[] array; public void withdraw(Comparable object) { if(count == 0) throw new ContainerEmptyException (); int i = 0; while(i < count && array[i] != object) ++i; if(i == count) throw new IllegalArgumentException("objeto não encontrado");
Método withdraw (2) for( ; i < count - 1; ++i) array[i] = array[i + 1]; array[i] = null; --count; } // ... }
Posição de um item em uma lista por meio da Classe Interior OrderedListAsArray.MyCursor (1) public class OrderedListAsArray extends AbstractSearchableContainer implements OrderedList { protected Comparable[] array; protected class MyCursor implements Cursor { int offset; MyCursor (int offset) { this.offset = offset; }
Posição de um item em uma lista por meio da Classe Interior OrderedListAsArray.MyCursor (2) public Comparable getDatum() { if(offset < 0 || offset >= count) throw new IndexOutOfBoundsException(); return array [offset]; } // ... } // ... }
Busca de um item e acesso por posiçãoMétodos findPosition e get de OrderedListAsArray public class OrderedListAsArray extends AbstractSearchableContainer implements OrderedList { protected Comparable[] array; public Cursor findPosition(Comparable object) { int i = 0; while(i < count && array[i].isNE(object)) ++i; return new MyCursor(i); } public Comparable get(int offset) { if(offset < 0 || offset >= count) throw new IndexOutOfBoundsException(); return array[offset]; } // ... }
Inserção de itens em posições arbitrárias Métodos insertBefore e insertAfter de OrderedListAsArray
Método insertAfter (1) public class OrderedListAsArray extends AbstractSearchableContainer implements OrderedList { protected Comparable[] array; protected class MyCursor implements Cursor { int offset;
Método insertAfter (2) public void insertAfter (Comparable object) { if(offset < 0 || offset >= count) throw new IndexOutOfBoundsException(); if(count == array.length) throw new ContainerFullException(); int insertPosition = offset + 1; for(int i = count; i > insertPosition; --i) array[i] = array[i - 1]; array[insertPosition] = object; ++count; } // ... } // ... }
Método insertBefore (1) public class OrderedListAsArray extends AbstractSearchableContainer implements OrderedList { protected Comparable[] array; protected class MyCursor implements Cursor { int offset;
Método insertBefore (2) public void insertBefore(Comparable object) { if(offset < 0 || offset >= count) throw new IndexOutOfBoundsException(); if(count == array.length) throw new ContainerFullException(); int insertPosition = offset; for(int i = count; i > insertPosition; --i) array[i] = array[i - 1]; array[insertPosition] = object; ++count; } // ... } // ... }
Exclusão de itens em posições arbitrárias Método withdraw de OrderedListAsArray
Método withdraw (1) public class OrderedListAsArray extends AbstractSearchableContainer implements OrderedList { protected Comparable[] array; protected class MyCursor implements Cursor { int offset;
Método withdraw (2) public void withdraw() { if(offset < 0 || offset >= count) throw new IndexOutOfBoundsException(); if(count == 0) throw new ContainerEmptyException(); int i = offset; while(i < count - 1) { array[i] = array[i + 1]; ++i; } array[i] = null; --count; } // ... } // ... }
Métodos da classe LinkedList • getDatum • getNext • Construtor e purge • getHead • getTail • isEmpty • getFirst • getLast • prepend • append • assign • extract • insertAfter • insertBefore
Classe OrderedListAsLinkedList public class OrderedListAsLinkedList extends AbstractSearchableContainer implements OrderedList { protected LinkedList linkedList; // ... }
Construtor e métodos de inserção de objeto (1) public class OrderedListAsLinkedList extends AbstractSearchableContainer implements OrderedList { protected LinkedList linkedList; public OrderedListAsLinkedList() { linkedList = new LinkedList(); } public void insert(Comparable object) { linkedList.append(object); ++count; }
Construtor e métodos de inserção de objeto (2) public Comparable get(int offset) { if(offset < 0 || offset >= count) throw new IndexOutOfBoundsException(); LinkedList.Element ptr = linkedList.getHead(); for(int i = 0; i < offset && ptr != null; ++i) ptr = ptr.getNext(); return (Comparable) ptr.getDatum(); } // ... }
Métodos isMember e find (1) public class OrderedListAsLinkedList extends AbstractSearchableContainer implements OrderedList { protected LinkedList linkedList; public boolean isMember (Comparable object) { for(LinkedList.Element ptr = linkedList.getHead(); ptr != null; ptr = ptr.getNext()) { if((Comparable) ptr.getDatum() == object) return true; } return false; }
Métodos isMember e find (2) public Comparable find (Comparable arg) { for(LinkedList.Element ptr = linkedList.getHead(); ptr != null; ptr = ptr.getNext()) { Comparable object = (Comparable) ptr.getDatum(); if(object.isEQ(arg)) return object; } return null; } // ... }
Método withdraw public class OrderedListAsLinkedList extends AbstractSearchableContainer implements OrderedList { protected LinkedList linkedList; public void withdraw (Comparable object) { if(count == 0) throw new ContainerEmptyException(); linkedList.extract(object); --count; } // ... }
Classe Interior OrderedListAsLinkedList.MyCursor public class OrderedListAsLinkedList extends AbstractSearchableContainer implements OrderedList { protected LinkedList linkedList; protected class MyCursor implements Cursor { LinkedList.Element element; MyCursor(LinkedList.Element element) { this.element = element; } public Comparable getDatum() { return (Comparable) element.getDatum(); } // ... } // ... }
Busca de um item e acesso por posição Método findPosition public class OrderedListAsLinkedList extends AbstractSearchableContainer implements OrderedList { protected LinkedList linkedList; public Cursor findPosition (Comparable arg) { LinkedList.Element ptr; for(ptr = linkedList.getHead(); ptr != null; ptr = ptr.getNext()) { Comparable object = (Comparable) ptr.getDatum(); if(object.isEQ(arg)) break; } return new MyCursor (ptr); } // ... }
Método insertAfter public class OrderedListAsLinkedList extends AbstractSearchableContainer implements OrderedList { protected LinkedList linkedList; protected class MyCursor implements Cursor { LinkedList.Element element; public void insertAfter (Comparable object) { element.insertAfter(object); ++count; } // ... } // ... }
Exclusão de item correnteMétodo withdraw public class OrderedListAsLinkedList extends AbstractSearchableContainer implements OrderedList { protected LinkedList linkedList; protected class MyCursor implements Cursor { LinkedList.Element element; public void withdraw() { linkedList.extract(element.getDatum()); --count; } // ... } // ... }
Listas Classificadas - Sumário • Introdução • Implementação sobre “Arrays” • Implementação sobre Listas Encadeadas