Немного о коллекциях
Collection представляет собой группу объектов, часто называемых элементами. Некоторые реализации данного интерфейса позволяют дублирование содержащихся элементов, а некоторые нет. Некоторые хранят объекты в упорядоченном виде, а некоторые - в неупорядоченном.
List — это список объектов. Объекты можно добавлять в список (метод add()), заменять в списке (метод set()), удалять из списка (метод remove()), извлекать (метод get()). Существует также возможность организации прохода по списку при помощи итератора. Среди реализаций этого интерфейса в составе JDK имеются классы ArrayList и LinkedList.
Set — множество объектов. Те же возможности, что и у List, но объект может входить в множество только один раз. При этом напрямую получить конкретный объект из множества нельзя, можно только проверить, входит ли данный объект в множество (метод contains()). Однако можно получить итератор, который содержит все объекты из множества. Классы, реализующие интерфейс: HashSet, TreeSet.
Map — отображение или ассоциативный массив. В Map добавляют не отдельные объекты, а пары объектов ( "ключ-значение" ). Соответственно есть операции поиска значения по ключу. Добавление пары с уже существующим в Map ключем приводит к замене, а не к добавлению. Из отображения (Map) можно получить множество (Set) ключей и список (List) значений. Классы, реализующие интерфейс: HashMap и TreeMap.
Сортировка в коллекциях
Теперь я расскажу как реализовать сортировку в коллекции по определенному полю элемента. Для начала создадим класс элемента коллекции, в нашем случае это будет Book.
public class Book{
private String name; // имя
private int nPages; // количество страниц
public Book(String bookname, int npages)
{
this.name=bookname;
this.nPages=npages;
}
public String toString()
{
return "[Book: "+name + " Pages: " + nPages+"]";
}
public String getBookName()
{
return name;
}
public int getNPages()
{
return nPages;
}
}
Данный класс очень простой, он содержит только два поля: имя книги и количество страниц. Допустим у нас есть контейнер для этого класса, который выглядит следующим образом
public class BookList{
private TreeSet<Book> al = new TreeSet<Book>();
public void add(Book obj) {
al.add(obj);
}
public int count() {
return al.size();
}
public void print()
{
System.out.println(al);
}
}
Этот контейнер предлагает следующие возможности: хранение неограниченого количества элементов Book, добавление новых элементов с помощью метода add, количество элементов в коллекции, и вывод в консоль всех элементов коллекции. Но при добавлении нового элемента, он будет записыватся в конец множества TreeSet, а мы хотим чтоб элементы автоматически сортировались по возрастанию относительно поля int nPages (количество страниц книги). Это задача решается очень просто. В классе Book необходимо реализовать интерфейс Comparable<T>. Затем переопределить метод int compareTo(Object obj). Ниже приведен пример класса Book с необходимыми изменениями
public class Book implements Comparable<Book>{
...
public int compareTo(Object obj)
{
int otherNPages = ((Book) obj).getNPages();
if (nPages == otherNPages)
return 0;
else
return (nPages < otherNPages) ? 1 : -1;
}
...
}
Теперь для тех кто в танке. Метод compareTo автоматически вызывается при добавлении нового элемента и ищет куда ему вставить новый элемент в коллекцию. Он проверяет количество страниц добавляемой книги и остальных, таким образом реализуется так называемая сортировка коллекции по умолчанию. Полный исходный код с реализацией второй части задания доступен ниже.
Gubsky