Закончил тему:
12. Коллекции.- Списки(List).
- Множества (Set).
- Отображения (Map).
- Класс Collections.
- Сортировка коллекций. Интерфейс Comparable и Comparator.
Коллекции (collections) или контейнеры (containers) предназначены для работы с группой элементов.
Элементом коллекции является объект.
Коллекции обеспечивают хранение элементов и доступ к ним.
List – «список» – коллекция элементов, следующих в определенном порядке.
Set – «множество» – коллекция, не допускающая наличия одинаковых элементов .
Map –«отображение», множество элементов, доступ к которым осуществляется по ключу.
Задачи:
1. РАБОТА СО СПИСКАМИ.
1. Разработайте класс com.spec.IntValues, управляющий множеством целых чисел с использованием списка ArrayList.
Класс должен содержать:
• скрытое поле ArrayList<Integer> values
• конструктор по умолчанию, создающий список чисел
• конструктор IntValues(int[] arr), создающий список и заполняющий его значениями заданного массива
• метод void add(int x), добавляющий заданное число в список
• метод void delete(int index), удаляющий из списка число с порядковым номером index
• метод int get(int index), возвращающий число с порядковым номером index
• метод int sum(), вычисляющий сумму чисел
• метод int min(), находящий минимальное число в списке
• метод int max(), находящий максимальное число в списке
• метод double avg(), вычисляющий среднее арифметическое значение чисел
• метод int length(), возвращающий количество чисел в списке
• метод toString(), возвращающий строку с числами из списка
2. Разработайте программу, демонстрирующую работу с классом com.spec.IntValues
| Java | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
| import java.util.ArrayList;
public class IntValues {
private ArrayList<Integer> values;
public IntValues() {
values = new ArrayList<Integer>();
}
public IntValues(int[] arr) {
this();
for (int iter : arr) {
values.add(iter);
}
}
public void add(int x) {
values.add(x);
}
public void delete(int index) {
values.remove(index);
}
public int get(int index) {
return values.get(index);
}
public int sum() {
int sum = 0;
for (int iter : values)
sum = sum + iter;
return sum;
}
public int min() {
int min = values.get(0);
for (int iter : values)
if (min > iter)
min = iter;
return min;
}
public int max() {
int max = values.get(0);
for (int iter : values)
if (max < iter)
max = iter;
return max;
}
public double avg() {
double sum = 0;
int quant = 0;
for (int iter : values)
sum = sum + iter;
return sum / values.size();
}
public int length() {
return values.size();
}
public String toString() {
return values.toString();
}
} |
|
| Java | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
| import java.util.Random;
import java.util.Scanner;
public class DZ121 {
public static void main(String[] args) {
int n, i;
System.out.println("Введите количество элементов массива: ");
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
int[] mas = new int[n];
Random rn = new Random();
for (i = 0; i < mas.length; i++)
mas[i] = rn.nextInt(0, 99);
IntValues iv = new IntValues(mas);
System.out.println("Наш ArrayList: ");
for (i = 0; i < iv.length(); i++) {
System.out.print(iv.get(i) + " ");
}
System.out.println();
System.out.println();
System.out.println("Добавляем число в конец коллекции");
iv.add(10);
System.out.println("Наш ArrayList после добавления: ");
for (i = 0; i < iv.length(); i++) {
System.out.print(iv.get(i) + " ");
}
System.out.println();
System.out.println("\nУдаляем число из коллекции c индексом 1");
iv.delete(1);
System.out.println("Наш ArrayList после удаления: ");
for (i = 0; i < iv.length(); i++) {
System.out.print(iv.get(i) + " ");
}
System.out.println();
System.out.println("\nЗапрашиваем элемент с индексом 3 - " + iv.get(3));
System.out.println("Сумма всех чисел коллекции = " + iv.sum());
System.out.println("Минимальное число коллекции = " + iv.min());
System.out.println("Максимальное число коллекции = " + iv.max());
System.out.println("Среднее арифметическое = " + iv.avg());
System.out.println();
System.out.println("А вот наша коллекция в виде строки: " + iv.toString());
System.out.println("Hello World!");
}
} |
|
2. ИСПОЛЬЗОВАНИЕ КОМПАРАТОРОВ. АНОНИМНЫЕ КЛАССЫ
1. Реализуйте в классе com.spec.Vector интерфейс Comparable. Сравнение векторов в методе compareTo должно осуществляться по координате x.
2. Разработайте анонимный класс-компаратор, сравнивающий вектора Vector по их длине.
3. Создайте список (ArrayList) из различных векторов
4. Упорядочите список векторов на основе встроенного метода сравнения
5. Выведите упорядоченный список векторов на экран
6. Упорядочите список векторов, используя класс-компаратор
7. Выведите упорядоченный список векторов на экран
| Java | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| public class Point {
private int x, y;
public Point() {
setCoord(0, 0);
}
public Point (int x, int y){
this.x = x;
this.y = y;
}
public void setCoord(int x, int y){
this.x = x;
this.y = y;
}
public int getCoordX(){
//System.out.println("x = " + x + " y = " + y);
return x;
}
public int getCoordY(){
//System.out.println("x = " + x + " y = " + y);
return y;
}
} |
|
| Java | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
| import java.util.Comparator;
public class Vector extends Point implements Comparable<Vector> {
public Vector(){
//super();
}
public Vector(int nx, int ny){
super(nx, ny);
}
public Vector sum(Vector v){
int xsum, ysum;
Vector vsum = new Vector();
xsum = getCoordX() + v.getCoordX();
ysum = getCoordY() + v.getCoordY();
vsum.setCoord(xsum, ysum);
return vsum;
}
public Vector sub(Vector v){
int xsub, ysub;
Vector vsub = new Vector();
xsub = getCoordX() - v.getCoordX();
ysub = getCoordY() - v.getCoordY();
vsub.setCoord(xsub, ysub);
return vsub;
}
public int multi(Vector v){
int scal;
scal = this.getCoordX() * v.getCoordX() + this.getCoordY() * v.getCoordY();
return scal;
}
public boolean isOrtho (Vector v){
int scal;
scal = this.getCoordX() * v.getCoordX() + this.getCoordY() * v.getCoordY();
if (scal == 0)
return true;
else
return false;
}
public double length() {
return Math.sqrt(Math.pow(this.getCoordX(), 2) + Math.pow(this.getCoordY(), 2));
}
public void print(Vector v) {
System.out.println("Coord X = " + v.getCoordX() + " Coord Y = " + v.getCoordY() + "Length = " + v.length());
}
@Override
public int compareTo(Vector o) {
//o = (Integer)o;
if(this.getCoordX() > o.getCoordX()) {
return 1;
}
else if (this.getCoordX() < o.getCoordX())
return -1;
else
return 0;
}
} |
|
| Java | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
| import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class DZ122 {
public static void main(String[] args) {
Vector vec = new Vector();
System.out.println("Проверочка координат конструктора по умолчанию");
vec.print(vec);
Vector vec2 = new Vector(5, 5);
Vector vec3;
vec3 = vec.sum(vec2);
System.out.println("Координаты суммы векторов");
vec.print(vec3);
vec3 = vec.sub(vec2);
System.out.println("Координаты разности векторов");
vec.print(vec3);
System.out.println("Скалярное произвед векторов = " + vec.multi(vec2));
System.out.println("Перпендикулярны ли векторы - " + vec.isOrtho(vec));
System.out.println("Длина вектора = " + vec.length());
System.out.println("Hello World!");
ArrayList<Vector> arr = new ArrayList();
arr.add(new Vector(5, 9));
arr.add(new Vector(4, 4));
arr.add(new Vector(7, 3));
arr.add(new Vector(9, 7));
arr.add(new Vector(1, 8));
Collections.sort(arr);
for (Vector iter : arr) {
iter.print(iter);
}
System.out.println();
Comparator<Vector> myComp = new Comparator<Vector>() {
@Override
public int compare(Vector o1, Vector o2) {
return (int) (o1.length() - o2.length());
}
};
Collections.sort(arr, myComp);
for (Vector iter : arr) {
iter.print(iter);
}
}
} |
|
3. РАБОТА С HASHSET.
1. Разработайте класс com.spec.ImmutablePoint– неизменяемая точка на плоскости.
Класс должен содержать:
• скрытые final поля int x и int y
• конструктор, инициализирующий значение полей
• методы для чтения значений полей
2. Создайте множество различных точек ImmutablePoint, используя класс HashSet. Проверьте, могут ли одинаковые точки присутствовать в множестве. Проверьте работу методов remove и contains.
HashSet<ImmutablePoint>hs= ...
hs.add(new ImmutablePoint(10,20))
hs.add(new ImmutablePoint(10,20))
...
hs.remove(new ImmutablePoint(10,20))
3. В классе ImmutablePoint переопределите метод equals (класс Object), сравнивающий на равенство точку с заданным объектом. Метод должен возвращать true, при сравнении с объектом класса ImmutablePoint в случае равенства координат
4. В классе ImmutablePoint переопределите метод hashCode (класс Object). Метод должен возвращать сумму координат точки
5. Создайте множество различных точек ImmutablePoint, используя класс HashSet. Убедитесь, что методы HashSet работают корректно.
| Java | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| public class ImmutablePoint {
final private int x, y;
public ImmutablePoint(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
@Override
public boolean equals(Object o) {
// if (this == o)
// return true;
//
// if (o == null || getClass() != o.getClass())
// return false;
ImmutablePoint e = (ImmutablePoint) o;
return this.getX() == e.getX() && this.getY() == e.getY();
}
@Override
public int hashCode() {
return getX() + getY();
}
} |
|
| Java | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
| import java.util.HashSet;
public class DZ123 {
public static void main(String[] args) {
ImmutablePoint a = new ImmutablePoint(11, 33);
HashSet<ImmutablePoint> hs = new HashSet<ImmutablePoint>();
hs.add(new ImmutablePoint(10, 20));
hs.add(new ImmutablePoint(15, 40));
hs.add(new ImmutablePoint(7, 8));
hs.add(new ImmutablePoint(10, 20));
hs.add(a);
for (ImmutablePoint iter : hs) {
System.out.print("Точка Х = " + iter.getX());
System.out.println(" Y = " + iter.getY());
}
if (hs.contains(a))
System.out.println("Элемент присутствует в множестве!");
else
System.out.println("Элемент не присутствует в множестве!");
//boolean b = hs.remove(new ImmutablePoint(20, 30));
if (hs.remove(a))
System.out.println("Элемент удален!");
else
System.out.println("Элемент не удален!");
System.out.println();
for (ImmutablePoint iter : hs) {
System.out.print("Точка Х = " + iter.getX());
System.out.println(" Y = " + iter.getY());
}
// множество позволяет содержать объекты с одинаковыми координатами!
}
} |
|
4. РАБОТА СО СПИСКАМИ, МНОЖЕСТВАМИ И ОТОБРАЖЕНИЯМИ.
1. Создайте класс Книги.
2. Создайте список на основе класса Книги
3. Создайте множество на основе класса Книги
4. Создайте отображение на основе класса Книги
5. Отсортируйте коллекции по разным полям с помощью интерфейсов Comparable и Comparator
| Java | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
| public class Books implements Comparable<Books> {
int num;
String title;
@Override
public int compareTo(Books o) {
if (this.num > o.num) {
return 1;
}
else if (this.num < o.num)
return -1;
else
return 0;
}
public Books(int num, String title) {
this.num = num;
this.title = title;
}
public int getNum() {
return num;
}
public String getTitle() {
return title;
}
@Override
public boolean equals(Object aBook) {
Books b = (Books) aBook;
return getTitle().equals(b.getTitle());
}
@Override
public int hashCode() {
return getTitle().hashCode();
}
} |
|
| Java | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
| import fr.collect.Collect.Comp;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
public class Collect {
ArrayList<Books> bookList = new ArrayList();
public static void main(String[] args) throws FileNotFoundException {
new Collect().go();
System.out.println("Hello World!");
}
public class Comp implements Comparator<Books> {
@Override
public int compare(Books o1, Books o2) {
return o1.getTitle().compareTo(o2.getTitle());
//return o1.getNum() - o2.getNum();
}
}
public void go() throws FileNotFoundException {
getBooks();
Comp comp = new Comp();
//System.out.println(bookList);
System.out.println("Результат в порядке добавления");
for (Books iter : bookList) {
System.out.print(iter.num + " ");
System.out.println(iter.title);
}
System.out.println();
Collections.sort(bookList);
//System.out.println(bookList);
System.out.println("Результат ArrayList, отсортированный по номеру");
for (Books iter : bookList) {
System.out.print(iter.num + " ");
System.out.println(iter.title);
}
Set<Books> bookSet = new TreeSet<Books>(comp);
bookSet.addAll(bookList);
//Collections.sort(bookSet);
System.out.println();
System.out.println("Результат TreeSet, по умолчанию по названию");
for (Books iter : bookSet) {
System.out.print(iter.num + " ");
System.out.println(iter.title);
}
}
public void getBooks() throws FileNotFoundException {
try {
File file = new File("E:\\Javatxt\\BooksList.txt");
BufferedReader reader = new BufferedReader(new FileReader(file));
String line = null;
while ((line = reader.readLine()) != null) {
addBook(line);
}
}
catch (IOException e) {
e.printStackTrace();
}
}
public void addBook(String lineToParse) {
String [] tokens = lineToParse.split("/");
int tokInt = Integer.parseInt(tokens[0]);
Books nextBook = new Books(tokInt, tokens[1]);
bookList.add(nextBook);
}
} |
|
Лабы.
1.
(Частотный анализ слов в тексте)
Задача. Написать класс, который считает сколько раз каждое слово встречается в тексте/файле. Полученный результат должен представлять собой коллекцию, состоящую из пар, слово - счётчик. При создании объекта класса ему необходимо передать имена входного и выходного файлов. Основной метод «countWords» проводит анализ предлагаемого входного файла, а в случае его отсутствия анализирует тестовую строку.
Алгоритм. Исходный текст читаем построчно, затем каждая строка разбивается на слова. Проверяем наличие этого слова в коллекции и если результат поиска отрицательный, то добавляем в коллекцию пару: слово и счётчик=1 . В противном случае просто увеличиваем счётчик на один.
- Открыть существующий проект /Labs4/MyCounter. Проект состоит из парсера командной строки и метода «main».
- Добавить в проект новый класс «WordCount».
- Данные члены класса:
• объявить строковую переменную «inFile» для хранения имени входного файла;
• объявить строковую переменную «outFile» для хранения имени выходного файла;
• объявить статическую строковую переменную «testString» с любым латинским текстом. Эта строка будет использоваться для тестового запуска программы при отсутствии входного файла.
• объявите коллекцию с именем «words» и типом «Hashtable», создайте объект этого типа. Добавьте метод для доступа к этой коллекции «getWords()»
- Конструктор: Создать конструктор с двумя строковыми параметрами и использовать их для инициализации членов класса «inFile» и «outFile».
- Объявите метод «countWords» без параметров и без возвращаемого значения. В теле метода реализовать алгоритм анализа частоты слов:
• объявить следующую переменную
Reader reader;
• проверить наличие входного файла. Если его нет, то инициализировать «reader» новым объектом класса «StringReader» с параметром «testString». Если файл есть, то новым объектом класса «FileReader» с параметром «inFile».
• поместить полученный объект в объект класса «BufferedReader», который обладает функционалом чтения текстов построчно
BufferedReader br=new BufferedReader(reader);
• написать цикл для построчного чтения текста.
for (String line = br.readLine(); line != null; line = br.readLine()) {... }
• в теле цикла разбить строку «line» на слова. Используйте для этого класс «String Tokenizer st; st=new ....».
• напишите цикл по полученным словам. Используйте цикл «while(...) {... }».
• в теле цикла «while» создайте строковую переменную «token» и присвойте ей
st.nextToken();
• проверь наличие слова, находится в переменной «token», в коллекции «words»
words.containsKey(token)
• если слова нет, то добавьте его в коллекцию, а второй параметр установите в значение равное одному. Это и будет счётчик число повторений слова;
• если есть, то извлеките из коллекции значение счётчика для нашего слова, увеличьте счётчик и снова добавьте его в коллекцию;
Object val = words.get(token);
int n=(int) val;
n++;
words.put(token,n);
• закройте входной поток.
- Откройте метод «main». Удалите комментарии и запустите программу в тестовом режиме, проверьте полученный результат. Запустите программу с входным файлом (файл уже лежит в каталоге проекта и в настройках проекта задана командная строка).
| Java | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
| import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.Reader;
import java.util.Collections;
import java.util.Comparator;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
public class WordCount {
public String inFile;
public String outFile;
String line;
public static String testString = "aaa bbb aaa";
public WordCount(String s1, String s2) {
inFile = s1;
outFile = s2;
}
Map<String,Integer> words = new Hashtable();
public void countWords() throws FileNotFoundException, IOException {
String token;
Reader reader;
reader = new FileReader(inFile);
BufferedReader br = new BufferedReader(reader);
for (line = br.readLine(); line != null; line = br.readLine()) {
StringTokenizer st = new StringTokenizer(line, " ");
while (st.hasMoreTokens()) {
token = st.nextToken();
if (words.containsKey(token)) {
Object val = words.get(token);
int n = (int) val;
n++;
words.put(token, n);
}
else
words.put(token, 1);
}
}
br.close();
}
public void getWords() throws FileNotFoundException, IOException {
PrintWriter outF = new PrintWriter(outFile);
// OutputStreamWriter outF = new OutputStreamWriter(outFile);
BufferedWriter boutF = new BufferedWriter(outF);
for (Map.Entry<String, Integer> iter : words.entrySet()) {
System.out.println("Слово - " + iter.getKey() + " Количество - " + iter.getValue());
boutF.write(iter.getKey());
boutF.write(" ");
boutF.write(iter.getValue() + "\n");
System.out.println();
}
// Set sss = words.entrySet();
//Collections.sort(words);
// Iterator<Map.Entry<String, Integer>> iterator = words.entrySet().iterator();
// while (iterator.hasNext()) {
// Map.Entry<String, Integer> iter = iterator.next();
// System.out.println("Слово - " + iter.getKey() + " Количество - " + iter.getValue());
// }
boutF.close();
}
} |
|
| Java | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Hashtable;
public class LB4 {
public static void main(String[] args) throws FileNotFoundException, IOException {
String f1 = "E:\\Javatxt\\readme.txt";
String f2 = "E:\\Javatxt\\writeme.txt";
WordCount w = new WordCount(f1, f2);
w.countWords();
w.getWords();
System.out.println("Hello World!");
}
} |
|
|