Коллекции и ассоциативные массивы
Базовые операции со списками
Заставьте работать следующий код
List<String> list1 = List.of("abc", "xyz", "ooo");
//функция распечатывает значения списка построчно. Воспользуйтесь циклом for each:
// в списке 3 элемента
// "abc"
// "xyz"
// "ooo"
printList(list1);
//функция распечатывает значения в списке вместе с их индексами. Воспользуйтесь обычным циклом
// в списке 3 элемента
// 0: "abc"
// 1: "xyz"
// 2: "ooo"
printListWithIndices(list1);
//создать и вернуть список чисел от 1 до 20
List<Integer> list20 = createRange(20);
System.out.println("list20 = " + list20); // [1, 2, 3, ..., 20]
//эта функция должна поменять местами первый и последний элемент списка.
//Функция должна быть "чистой", это значит, что она не изменяет исходный список,
//а создает новый
List<Integer> list20swap = swapFirstAndLast(list20);
//распечатаем новый список и старый, чтобы убедиться, что старый список не изменился
System.out.println("list20swap = " + list20swap + ", but list20 = " + list20);
//эта функция аналогична предыдущей, но она ничего не возвращает, зато
//изменяет содержимое переданного списка
swapFirstAndLastInPlace(list20);
System.out.println("list20 = " + list20);
//скопируем значения из списка list1 в новый список list2
List<String> list2 = new ArrayList<>(list1);
//сделайте две версии функции, которая переворачивает список. Чистую функцию, и меняющую
//переданные значения:
List<String> list2rev = reverseList(list2);
System.out.println("list2rev = " + list2rev + ", but list2 = " + list2);
reverseListInPlace(list2);
System.out.println("list2 = " + list2);
//создадим числовой список для следующих функций. List.of создает неизменяемый список
List<Integer> ints = List.of(11, 22, 33, 55, 66, 88, 100, 3, 4);
System.out.println("ints = " + ints);
//функция должна отфильтровать четные числа из списка, оставить только нечетные
System.out.println("ints without even = " + filterEven(ints)); //[11, 33, 55, 3]
//функция должна удалить элементы с четными индексами, т.е. оставить только каждое второе число
System.out.println("ints no even indices = " + filterEvenIndices(ints)); //[22, 55, 88, 3]
//Необязательная часть
//Теперь реализуйте in-place аналоги этих функций, т.е. они делают действия, изменяя переданный список
//копируем список ints, создавая новый изменяемый (mutable) список intsMutable
List<Integer> intsMutable = new ArrayList<>(ints);
System.out.println("intsMutable = " + intsMutable);
filterEvenInPlace(intsMutable);
System.out.println("intsMutable without even = " + intsMutable); //[11, 33, 55, 3]
filterEvenIndicesInPlace(intsMutable);
System.out.println("intsMutable without even indices = " + intsMutable); //[33, 3]
Разные виды коллекций
Реализуйте функцию readWordsFromFile
, чтобы работал следующий код:
//при указании типа здесь можно написать Collection<String>, List<String> или ArrayList<String>
List<String> wordsList = new ArrayList<>();
//здесь можно написать Collection<String>, Set<String> или HashSet<String>
Set<String> wordsHashSet = new HashSet<>();
Set<String> wordsLinkedHashSet = new LinkedHashSet<>();
Set<String> wordsTreeSet = new TreeSet<>();
// Эта функция открывает указанный файл и читает все слова из него в указанную коллекцию.
// Возьмите какой-нибудь большой текст на русском. Используйте Scanner для чтения слов, приводите слова к нижнему
// регистру.
// Тип второго аргумента функции должен быть Collection<String>, это означает, что передать можно
// любую коллекцию, в частности, любые списки и множества
readWordsFromFile("text.txt", wordsList);
readWordsFromFile("text.txt", wordsHashSet);
readWordsFromFile("text.txt", wordsLinkedHashSet);
readWordsFromFile("text.txt", wordsTreeSet);
System.out.println("wordsList = " + wordsList);
System.out.println("wordsHashSet = " + wordsHashSet);
System.out.println("wordsLinkedHashSet = " + wordsLinkedHashSet);
System.out.println("wordsTreeSet = " + wordsTreeSet);
Ассоциативные массивы
Ассоциативные массивы
-
Дана строка. Посчитать каждый символ, сколько раз он встретился. Например, строка “banana” должна выдать массив
Map<Character, Integer>
:'b' -> 1 'a' -> 3 'n' -> 2
-
Аналогично предыдущему, но выдать
Map<Character, List<Integer>>
со списком индексов, где встретился символ:b -> [0] a -> [1, 3, 5] n -> [2, 4]
-
Частотный словарь слов из файла. Т.е. нужно прочитать слова из файла и посчитать, сколько раз они встретились. Приводите слова к нижнему регистру перед подсчетом. Желательно использовать большой текст на русском, например, возьмите его на http://lib.ru. Используйте
Scanner.useDelimiter()
, чтобы указать сканеру, какие символы считать разделителями слов.- Сначала используйте
HashMap
- Попробуйте заменить
HashMap
наLinkedHashMap
и наTreeMap
. Как изменился результат? - (не обязательно) Исправьте программу так, чтобы она использовала все три вида массивов: HashMap, TreeMap, LinkedHashMap. Соответственно, выведите ответ три раза. Не дублируйте код.
- (не обязательно) Выведите слова в порядке уменьшения частот. Вам потребуется отсортировать список List<Map.Entry<String, Integer»
- Сначала используйте