Коллекции: алгоритмы, генерики
Приведение типов Предположения о типах объектов: void innerMethod( Object o ){ //Ошибка времени выполнения int val = (Integer)o; … } void caller(){ innerMethod( 1 ); }
Проверка во время выполнения //Использование блока try/catch: try{ Object o = new String( 1.0 ); double d = (Double)o; }catch( Exception exc ){} //Проверка типа через RTTI: Object o = new String( 1.0 ); if( o instanceof String ) String s = (String)o; else if( o instanceof Integer ) int i = (Integer)o;
Autoboxing – «оборачивание» простых типов Без оборачивания: List intList = new ArrayList(); //Добавление записей: intList.add( new Integer(1) ); intList.add( new Integer(2) ); … //Использование записей из списка: Integer intObj = (Integer)intList.get(0); if( intObj.intValue() == 1 ){ … }
Autoboxing – «оборачивание» простых типов С оборачиванием: List intList = new ArrayList(); //Добавление записей: intList.add( 1 ); intList.add( 2 ); … //Использование записей из списка: if( ((Integer)intList.get(0)) == 1 ){ … } Дополнительное приведение типов, т.к. типы элементов не известны для JVM.
Обобщенные типы - Generics Generics - Используются для проверки типов во время компиляции. public interface List { void add(E x); Iterator iterator(); } List list = new ArrayList (); list.add( 1 ); list.add( 1 ); //Ошибка во время компиляции Использование generics при создании экземпляра класса ArrayList аналогично описанию и созданию экземпляра класса: public interface IntegerList { void add(Integer x); Iterator iterator(); }
Использование масок Java до версии 5: void printCollection(Collection c){ Iterator i = c.iterator(); for (k = 0; k < c.size(); k++) { System.out.println(i.next()); } Аналог с Generics: void printCollection(Collection c){ for( Object e : c ){ System.out.println(e); } Ошибочный вариант: void printCollection(Collection c) { for (Object e : c) { System.out.println(e); }
Использование масок Объявление: public void group( List list ); Использование: List list = new ArrayList (); list.add( new Woodwind() ); group( list );
Generics generics/index.html
Алгоритмы – класс Collections Реализованы, как статические методы класса java.util.Collections sort – сортировка элементов; shuffle – расположение элементов в случайном порядке; reverse – обращение порядка следования элементов; fill – заполнение всех элементов одним значением; copy – копирование коллекций; swap – обмен двух элементов; addAll – добавление всех элементов; binarySearch – поиск элемента; frequency – количество повторений элемента; disjoint – определение признака пересечений коллекций; min/max – поиск экстремума
Сортировка Метод: java.util.Collections.sort( List, Comparator )
Задание 1 Разработать программу для вывода списка пользователей с сортировкой по имени, почтовому адресу, телефону. Пользователи заданы во входном файле в формате: ФИО, , телефон … Программа должна вывести на консоль справочную информацию и ожидать ввода команд пользователя. Например, fio-asc - вывод списка пользователей с сортировкой имен в алфавитном порядке.