
Программирование на java / Метод. ук. к л. р / Метод. ук. к л. р. 5
.docСТО АлтГТУ 13.62.1.0667-2011
Лабораторная работа №5. Коллекции
Цель работы: получить практические навыки работы с коллекциями объектов
5.1 Пример создания коллекции объектов с использованием интерфейса List и класса ArrayList
В листинге 5.1 представлена программа, которая рассчитывает координаты для перемещения на плоскости геометрической фигуры круг. Для круга также выполняется вычисление его площади. В программе описан абстрактный класс shape и на его основе производный класс Circle. Класс CircleList используется для работы с коллекцией List объектов класса Circle.
Программа выполнена в NetBeans IDE 7.3.1. На рис. 5.1. показан состав проекта программы. Рисунок 5.2 демонстрирует результат выполнения программы
Рисунок 5.1 – Состав проекта программы
Листинг 5.1
// Shape.java
package shape;
// базовый класс фигура
public abstract class Shape
{ protected String type;
public Shape() { }
public Shape(String t) { type = t; }
public String GetShape() { return type; }
public abstract void Move(double x1, double y1);
}
// Circle.java
package shape;
// производный класс круг
public class Circle extends Shape implements Comparable<Circle>
{ private double x, y, r;
public Circle(){ }
public Circle(String t, double x1, double y1, double r1)
{ super(t); x = x1; y = y1; r = r1; }
public String toString()
{ return "\n" + type + ". Координаты центра: x = " + x + ", y = " + y + ", r = " + r;
}
//переопределение метода Move
public void Move(double x1, double y1)
{ x += x1; y += y1;
String msg = "Новые координаты центра " + x + " " + y;
System.out.println(type + ". Результат перемещения: " + msg);
}
public double GetSquare()//вычисление площади
{ return Math.PI * Math.pow(r, 2); }
public int compareTo( Circle Cl)
{ int res = 0;
if(Cl.r < this.r) { res = 1; }
if(Cl.r > this.r) { res = -1;}
return res;
}
}
// CircleList.java
package shape;
import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Collections;
public class CircleList
{
private List<Circle> clist = new ArrayList<Circle>();
public void add( Circle obj) { clist.add(obj);}
public int count() { return clist.size();}
public void print() { System.out.println(clist);}
public void sort() { Collections.sort(clist);}
public void iterate1()
{ Iterator <Circle> it = clist.iterator();
while (it.hasNext())
{ Circle el = it.next();
System.out.println(el.GetShape() + ". Площадь: " + el.GetSquare());
}
}
public void iterate2()
{ double t4, t5;
Scanner in = new Scanner(System.in);
System.out.println("Передвинуть на x:");
t4 = in.nextDouble();
System.out.println("Передвинуть на y:");
t5 = in.nextDouble();
for(Circle el : clist)
el.Move(t4, t5);
}
}
// JavaApplication5_1.java
package javaapplication5_1;
import shape.*;
import java.util.Scanner;
public class JavaApplication5_1
{ public static void main(String[] args)
{ int pr;
double t1, t2, t3;
int i = 0;
CircleList circles = new CircleList();
Circle Cr; //окружность
Scanner in = new Scanner(System.in);
do { i++;
System.out.println("Вв. координату центра окружности x:");
t1 = in.nextDouble();
System.out.println("Вв. координату центра окружности y:");
t2 = in.nextDouble();
System.out.println("Вв. радиус окружности:");
t3 = in.nextDouble();
Cr = new Circle("Окружность " + i, t1, t2, t3);
circles.add(Cr);
System.out.println("Продолжить ввод? 1 - Да, 0 - Нет");
pr = in.nextInt();
}while(pr == 1);
circles.sort();
circles.print();
circles.iterate1();
circles.iterate2();
}
}
Рисунок 5.2 – Результат выполнения программы
Задание 1
Изменить программу индивидуального варианта лаб. работы. №3 (задание 1): добавить класс контейнер, который должен создавать и работать с коллекцией объектов производного класса. Для реализации коллекции использовать интерфейс List и один из классов: ArrayList или LinkedList. Выполнить сортировку объектов коллекции по какому-либо полю объекта с использованием интерфейса Comparable. Для обхода коллекции объектов использовать итератор.
5.2 Пример создания коллекции объектов с использованием интерфейса Set и класса TreeSet
В листинге 5.2 представлена программа, которая рассчитывает координаты для перемещения на плоскости геометрической фигуры круг. Для круга также выполняется вычисление его площади. В программе описан абстрактный класс shape и на его основе производный класс Circle. Класс CircleSet используется для работы с коллекцией Set объектов класса Circle.
Программа выполнена в NetBeans IDE 7.3.1. На рис. 5.3. показан состав проекта программы. Рисунок 5.4 демонстрирует результат выполнения программы.
Листинг 5.2
// Shape.java
package shape;
// базовый класс фигура
public abstract class Shape
{ protected String type;
public Shape() { }
public Shape(String t) { type = t; }
public String GetShape() { return type; }
public abstract void Move(double x1, double y1);
}
// Circle.java
package shape;
// производный класс круг
public class Circle extends Shape
{ private double x, y, r;
public Circle(){ }
public Circle(String t, double x1, double y1, double r1)
{ super(t); x = x1; y = y1; r = r1; }
public String toString()
{ return "\n" + type + ". Координаты центра: x = " + x + ", y = " + y + ", r = " + r;
}
//переопределение метода Move
public void Move(double x1, double y1)
{ x += x1; y += y1;
String msg = "Новые координаты центра " + x + " " + y;
System.out.println(type + ". Результат перемещения: " + msg);
}
public double GetSquare()//вычисление площади
{ return Math.PI * Math.pow(r, 2); }
public double getx(){ return x;}
public double gety(){ return y;}
public double getr(){ return r;}
}
// SortByRadius.java
package shape;
import java.util.Comparator;
public class SortByRadius implements Comparator <Circle>
{ public int compare(Circle c1, Circle c2)
{ int res = 0;
if(c1.getr() < c2.getr()) { res = 1; }
if(c1.getr() > c2.getr()) { res = -1;}
return res;
}
}
// CircleSet.java
package shape;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
import java.util.Iterator;
public class CircleSet
{ private Set<Circle> cset = new TreeSet<Circle>(new SortByRadius());
public void add( Circle obj) { cset.add(obj);}
public int count() { return cset.size();}
public void print() { System.out.println(cset);}
public void iterate1()
{ Iterator <Circle> it = cset.iterator();
while (it.hasNext())
{ Circle el = it.next();
System.out.println(el.GetShape() + ". Площадь: " + el.GetSquare());
}
}
public void iterate2()
{ double t4, t5;
Scanner in = new Scanner(System.in);
System.out.println("Передвинуть на x:");
t4 = in.nextDouble();
System.out.println("Передвинуть на y:");
t5 = in.nextDouble();
for(Circle el : cset)
el.Move(t4, t5);
}
}
// JavaApplication5.java
package javaapplication5;
import shape.*;
import java.util.Scanner;
public class JavaApplication5
{ public static void main(String[] args)
{ int pr;
double t1, t2, t3;
int i = 0;
CircleSet circles = new CircleSet();
Circle Cr; //окружность
Scanner in = new Scanner(System.in);
do { i++;
System.out.println("Вв. координату центра окружности x:");
t1 = in.nextDouble();
System.out.println("Вв. координату центра окружности y:");
t2 = in.nextDouble();
System.out.println("Вв. радиус окружности:");
t3 = in.nextDouble();
Cr = new Circle("Окружность " + i, t1, t2, t3);
circles.add(Cr);
System.out.println("Продолжить ввод? 1 - Да, 0 - Нет");
pr = in.nextInt();
}while(pr == 1);
circles.print();
circles.iterate1();
circles.iterate2();
}
}
Рисунок 5.3 – Состав проекта программы
Рисунок 5.4 – Результат выполнения программы
Задание 2
Изменить программу индивидуального варианта лаб. работы. №3 (задание 1): добавить класс контейнер, который должен создавать и работать с коллекцией объектов производного класса. Для реализации коллекции использовать интерфейс Set и класс TreeSet. Выполнить сортировку объектов коллекции по какому-либо полю объекта с использованием интерфейса Comparator. Для обхода коллекции объектов использовать итератор.