Autor wykładu : Wojciech Drabik



Pobieranie 417,97 Kb.
Strona3/5
Data24.02.2019
Rozmiar417,97 Kb.
1   2   3   4   5

ListIterator – iterator dla list, umożliwia dwukierunkową iterację,


zamianę elementów,wstawianie elementów i pobranie indeksu
interfejs Iterator
boolean hasNext()

Sprawdza czy kolekcja ma następny nie-przeiterowany element.

np. boolean hasMore = iterator.hasNext();
Object next()

Dostarcza odniesienie do następnego obiektu kolekcji.

np. Object obj = iterator.next();
Object remove()

Usuwa z kolekcji obiekt dostarczony przez ostatnie wywołanie funkcji next.

W odnośniku typu Object dostarcza odniesienie do tego obiektu.

np. iterator.remove();


interfejs ListIterator
void add(Object obj) //operacja opcjonalna
Wstawia do listy obiekt obj

Np. iterator.add(new String(”abc”);


boolean hasNext()

Sprawdza czy kolekcja ma następny nie-przeiterowany element.

np. boolean hasMore = iterator.hasNext();
Object next()

W odnośniku typu Object dostarcza odniesienie do następnego obiektu kolekcji.

np. Object obj = iterator.next();
boolean hasPrevious()

Sprawdza czy kolekcja ma poprzedni nie-przeiterowany element.

np. boolean hasMore = listIterator.hasPrevious();
Object previous()

Dostarcza odniesienie do poprzedniego obiektu kolekcji.

np. Object obj = listIterator.previous();
Object remove()

Usuwa z kolekcji obiekt dostarczony przez ostatnie wywołanie iteratora.

W odnośniku typu Object dostarcza odniesienie do tego obiektu.

np. iterator.remove();


Komparatory
Comparable – narzuca naturalne uporządkowanie elementów kolekcji.
Dla elementów Integer,Float.. naturalny porządek numeryczny.

Dla elementów typu String naturalny porządek słownikowy.

Dla elementów typu Date naturalny porządek chronologiczny.
Comparator – wprowadza własną relację porzadku;

może przedefiniowac naturalne uporządkowanie;

może być stosowany do porzadkowania obiektów

które nie implementują Comparable


interfejs Comparable
int compareTo(Object obj)

Dostarcza liczbę ujemną, jeżeli objekt this jest mniejszy niż obj



Dostarcza 0, jeżeli obiekt this jest równy obj

Dostarcza liczbę dodatnią, jeżeli obiekt this jest wiekszy niż obj

Np. int result = "Ala".compareTo("Kot");

interfejs Comparator
boolean equals(Object comp)

Sprawdza czy obiekt tegokomparatora jest równy obiektowi komparatora comp.

np.boolean isEqual = comp.equals(new MyComparator());
int compare(Object obj1, Object obj2)

Dostarcza liczbę ujemną, jeżeli obj1 jest mniejszy niż obj2



Dostarcza 0, jeżeli obiekt obj1 jest równy obj2

Dostarcza liczbę dodatnią, jeżeli obj1 jest wiekszy niż obj2.

np. int result = comp.compare(”abc”,”bcd”);

Uwaga-1:
Klasa implementująca Comparable powinna zapewnić że
sgn(x.compareTo(y) == - sgn[y.compareTo(x)]

x.compareTo(y)> 0 && y.compareTo(z)>0  x.compareTo(z)>0

x.compareTo(y)==0  sgn[x.compareTo(z)] == sgn[y.compareTo(z)]
Zalecane jest żeby naturalne uporząrządkowanie było zgodne z equals()

tzn. dla każdych dwóch obiektów powinna być spełniona równoważność :


obj1.compareTo(obj2) == 0  obj1.equals(obj2)
Uwaga-2 :
Klasa implementująca Comparator powinna zapewnić żeby :
sgn(compare(x,y) == - sgn[compare(y,x)]

compare(x,y)> 0 && compare(y,z)>0  compare(x,z)>0

compare(x,y)==0  sgn[compare(x,z)] == sgn[compare(y,z)]
Zalecane jest żeby uporządkowanie określone przez komparator

było zgodne z equals()

tzn. dla każdych dwóch obiektów powinna być spełniona równoważność :
compare(obj1,obj2)==0  obj1.equals(obj2)

Uwaga-3 :
Dowolna klasa która

przedefiniowuje Object.equals() musi również przedefiniować Object.hashCode()

tak aby

obj1.equals(obj2)==trueobj1.hashCode()==obj2.hashCode()
//------------------------------------------------------------------------------------------
UWAGA-4 :
Do kolekcji można dodać obiekt dowolnego typu,ale iterator dostarcza

obiekty w odnośniku typu Object ,więc informacja o typie wstawianego

obiektu jest tracona. Zatem przed użyciem pobranego obiektu należy

wykonać konwersję w dół na odpowiedni typ.


Przykład :

klasa Name implementuje interfejs Comparable.

Porównywanie obiektów klasy Name jest naturalne

według najpierw nazwiska a potem imienia.

import java.util.*;
public class Name implements Comparable{
private String firstName,lastName;
public Name(String firstName,String lastName)

{

if(first==null || lastName==null) throws new NullPointerException();

this.firstName = firstName;

this.LastName = lastName;

}
public String firstName(0) { return firstName; }



public String lastName() { return lastName; }
// przedefiniowanie equals()

public boolean equals(Object obj)

{

if(!(obj instanceof Name))return false;

Name n=(Name)obj;

Return n.firstName.equals(firstName) && n.lastName.equals(lastName);

}
//przedefiniowanie hashCode()

public int hashCode()

{

return 31*firstName.hashCode()+lastName.hashCode();

}
public String toString() { return firstName + ” ” + lastName }
public int compareTo(Object obj)

{

Name n=(Name)obj;

int lastCmp=lastName.compareTo(n.lastName);

return (lastCmp!=0 ? lastCmp : firstName.compareTo(n.firstName));

}

} //class Name
Jeżeli naturalnego uporządkowania nie da się zastosować lub jest nieodpowiednie do określonych celów to można zastosować własny komparator.
Przykład :

Własny komparator (hipotetyczny) porównujący liczby zespolone
Class Complex{
double x; double y;
public Complex(){ }
public Complex(double x, double y)

{

this.x=x; this.y=y;

}
public boolean equals(Object obj)

{

return (x == ((Complex)obj).x && y==((Complex)obj).y)

}
public String toString() { return "("+x+","+y+")"; }
} // class Complex


class MyComparator implements Comparator {
public int Compare(Object obj1,Object obj2)

{

double x1,y1; double x2,y2; double r1,r2;
x1=((Complex)obj1).x;

y1=((Complex)obj1).y;

x2=((Complex)obj2).x;

y2=((Complex)obj2).y;
r1=Math.sqrt(x1*x1+y1*y1);

r2=Math.sqrt(x2*x2+y2*y2);
if(r1

else if(r1==r2) return 0;

else return 1;
}

} //class MyComparator
Poniższy komparator spełnia warunki niezbędne dla komparatora(uwaga-2)

lecz nie jest zgodny z equals() - utożsamia elementy nie równe.


Ten komparator może służyć do sortowania listy lecz nie może być używany do porządkowania kolektora typu TreeSet lub TreeMap.

Oto program ilustrujący powyższy fakt.
import javax.swing.*;

import java.util.*;

import java.io.*;
public class Program {

Complex z1,z2,z3,z4;

public static void main(String[] args)

{

new Program(args);

}
public Program(String[] args)

{

// utworzenie 4 elementów

z1=new Complex(0,1);

z2=new Complex(1,0);

z3=new Complex(0,-1);

z4=new Complex(-1,0);
// testowanie czy są równe

System.out.println(z1.equals(z2)); //false
System.out.println(z1.equals(z3) || z2.equals(z3)); //false

System.out.println(z1.equals(z4) || z2.equals(z4) || z3.equals(z4)); //false

// utworzenie listy - obiektu ArrayList

ArrayList list=new ArrayList();

// dodanie różnych elementów do listy

list.add(z1);

list.add(z2);

list.add(z3);

list.add(z4);

// sortowanie listy przy pomocy własnego komparatora

Collections.sort(list,new MyComparator());

// wydrukowanie zawartości listy

System.out.println("List="+list);

//wszystkie dodane elementy są na liście

// utworzenie zbioru z własnym komparatorem

TreeSet set=new TreeSet(new MyComparator());

// próba dodania 4 różnych elementów do zbioru

set.add(z1);

set.add(z2);

set.add(z3);

set.add(z4);

// wydrukowanie zawartości zbioru

System.out.println("Set="+set);

// 3 elementy nie zostały dodane - komparator potraktował je jako równe

}

}


Wydruk programu :
false

false

false

List=[(0.0,1.0), (1.0,0.0), (0.0,-1.0), (-1.0,0.0)]

Set=[(0.0,1.0)]

Wyjątki
UnsupportedOperationException – generowany przez kolekcję w przypadku

wywołania nieobsługiwanej metody


ConcurrentModificationException – generowany przez iterator w trakcie iterowania

kolekcji przy próbie strukturalnej modyfikacji

przez inny iterator.
4. Elementy struktury kolekcji :
Interfejsy kolekcyjne: krótka charakterystyka
Collection - grupa obiektów,dowolny porządek,może mieć duplikaty
Set - zbiór,dowolny porzadek,nie może mieć duplikatów
SortedSet – zbiór którego elementy są automatycznie sortowane

według porządku naturalnego lub narzuconego przez komparator


List – lista, sekwencja,może mieć duplikaty,umożliwia pozycjonowanie
Map – mapa; odwzorowanie funkcyjne kluczwartość, klucze unikalne
SortedMap – mapa z automatycznym sortowaniem względem klucza

według porządku naturalnego lub narzuconego przez komparator


Uwaga-1 :
Mapa (Map) nie jest właściwą kolekcją ,ale ponieważ może być traktowana

jako kolekcja kluczy,wartości lub par (klucz,wartość) dlatego występuje

w strukturze kolekcji.
Uwaga-2 :
Niektóre funkcje w/w interfejsów są opcjonalne.

Oznacza to że pomimo ich zaimplementowania i wywołania nie zostaną wykonane (‘obsłużone’) lecz wygeneruja wyjątek UnsupportedOperationException

ze względu na to że są niewłaściwe dla danego typu kolekcji.

Jest to sygnalizacja błędu programu.

Przykładowo : jeżeli Array.asList() dostarcza kolekcję o ustalonym rozmiarze,

to jest uzasadnione że metody add(), remove() nie są obsługiwane.




specyfikacja funkcji


boolean add(Object obj) //operacja opcjonalna)

Dołącza na końcu kolekcji obiekt identyfikowany przez obj.

dostarcza true jeżeli kolekcja zmienia stan.

np. collection.add(new String("Ewa"));


boolean addAll(Collection c) //operacja opcjonalna

Dodaje do kolekcji wszystkie elementy podanej kolekcji

dostarcza true jeżeli kolekcja zmienia stan.
np. collection.addAll(new Collection());
void clear() //operacja opcjonalna

Usuwa z kolekcji wszystkie obiekty (czyni ją pustą).

np. collection.clear();
boolean contains(Object obj)

dostarcza true jeżeli kolekcja zawiera podany obiekt


np. boolean b=collection.contains(new String(”abc”));
boolean containsAll(Collection c)

dostarcza true jeżeli kolekcja zawiera wszystkie elementy podanej kolekcji

np. boolean b=collection.containsAll(new Collection());

boolean equals(Object obj)

sprawdza czy ta kolekcja jest równy równa jest kolekcji ientyfikowaną przez obj

np. boolean b=collection.equals(new String(”abc”));


int hashcode()

dostarcza wartość funkcji haszującej dla obiektu tej kolekcji

np. int x=collection.hashcode();


boolean isEmpty()

sprawdza czy kolekcja jest pusta .

np. boolean isEmpty = collection.isEmpty();
Iterator iterator()
dostarcza iterator dla elementów tej kolekcji.

Np. Iterator iterator=collection.iterator();


boolean remove(Object obj) //operacja opcjonalna

Usuwa z kolekcji podany obiekt obj.

Dostarcza true jeżeli kolekcja zawierała taki element(zmieniła stan).

np. collection.remove(person);


boolean removeAll(Collection c) //operacja opcjonalna

usuwa wszystkie elementy kolekcji które są również zawarte w danej kolekcji

np. collection.removeAll(new Collection());

boolean retainAll(Collection c) //operacja opcjonalna

pozostawia tylko te elementy które zawarte są w podanej kolekcji
np. collection.retainAll(new Collection());
int size()

Dostarcza liczbę obiektów umieszczonych w kolekcji.

np. int count = collection.size();
Object[] toArray()

Dostarcza tablicę zawierającą wszystkie elementy kolekcji


np. Object[] objects=collection.toArray()
Object[] toArray(Object[] a)

Dostarcza tablicę zawierającą wszystkie elementy kolekcji,

których typ czasu przebiegu jest zgodny z typem podanej tablicy.

Np. String[] x =

(String[]) collection.toArray(new String[0]);





specyfikacja funkcji

void add(int index, Object obj) //operacja opcjonalna

Umieszcza w kolekcji, na pozycji index, obiekt obj.

Obiekt, który uprzednio zajmował tę pozycję

oraz obiekty następujące po nim, przesuwa w prawo.

np. list.add(20, new String("Ewa"));
boolean addAll(int index, Collection c) //operacja opcjonalna

Wstawia wszystkie elementy podanej kolekcji do listy od pozycji index.

Element listy z tej pozycji i nastepne przesuwa w prawo.

dostarcza true jeżeli kolekcja zmieniła stan.


np. list.addAll(3,new Collection());

Object get(int index)

W odnośniku typu Object dostarcza odniesienie do obiektu

zajmującego w kolekcji pozycję index.

np. String name = (String)list.get(0);

int indexOf(Object obj)

Dostarcza indeks pierwszego obiektu kolekcji,

który w sensie funkcji equals jest równy obiektowi obj.

Dostarcza –1 jeśli nie ma takiego obiektu.

np. int pos = list.indexOf(ref);


int lastIndexOf(Object obj)

Dostarcza indeks ostatniego wystąpienia obiektu kolekcji,

który w sensie funkcji equals() jest równy obiektowi obj.

Dostarcza –1 jeśli nie ma takiego obiektu.

np. int pos = list.indexOf(ref);
ListIterator listIterator()

dostarcza iterator listy dla elementów tej listy.

np. Iterator iterator=list.ListIterator();

ListIterator listIterator(int index)

Dostarcza iterator dla elementów tej kolekcji począwszy od pozycji index

Np. Iterator iterator=list.ListIterator(3);
Object remove(int index) //operacja opcjonalna



1   2   3   4   5


©operacji.org 2017
wyślij wiadomość

    Strona główna