Monthly Archives: Октябрь 2015

Реализуем FirstInHashMap на основе HashMap

Однажды мне понадобилась одна вещь, которая работает как стандартный HashMap, но за небольшим исключением. Как известно HashMap хранит пары вида Ключ-Значение (Key-Value), а значение можно извлечь по ключу. Если в HashMap добавляется значение и ключ уже существующий в HashMap, то старое значение заменяется новым. Но мне нужно было, наоборот, чтобы старое значение не затиралось, а новое значение попросту игнорировалось. Для этого пришлось немного расширить HashMap, переопределив метод put:

public class FirstInHashMap<K,V> extends HashMap<K,V>{
	@Override
	public V put(K key, V value) {
		return super.containsKey(key) ? super.get(key) : super.put(key,value);
	}
}

Здесь первым делом идет проверка на присутствие ключа в HashMap. При наличии ключа идет поиск значения. При отсутствии ключа ключ и значение добавляются в HashMap. Заметим, что реализация нашего метода построена на вызовах методом (containsKey, get и put) из базового класса HashMap. Сигнатура метода put требует возвращения значения, значение берется от методов get и put соответственно.
Сравним работу HashMap и нашего FirstInHashMap:

Map<String,Object> map = new HashMap<>();
map.put("word",1);
map.put("word",5);
 
Map<String,Object> myMap = new FirstInHashMap<>();
myMap.put("word",1);
myMap.put("word",5);
 
System.out.println("HashMap: " + map.get("word"));//HashMap вернет 5
System.out.println("FirstInHashMap: " + myMap.get("word"));//FirstInHashMap 1

В данном примере мы кладем по порядку значения 1 и 5 с ключом word в обе Map’ы.
HashMap вернет 5, а FirstInHashMap вернет 1.

Разбивка текста на блоки фиксированной длины

Допустим, перед нами стоит задача разбить текст на блоки фиксированной длины.
Как пример можно взять строку:

oxxxxooox

и разбить на блоки по три символа:

oxx
xxo
oox

Это можно сделать следующим кодом:

String text = "oxxxxooox";//исходный текст
int portion = 3;//размер блока
int i = 0;
while(i < text.length()){
	System.out.println(text.substring(i,Math.min(i += portion, text.length())));
}

Функция substring вырезает часть строки в диапазоне [beginIndex,endIndex), т.е. начиная с позиции beginIndex включительно и до позиции endIndex (не включая саму позицию endIndex).
i += portion — определяет конец текущего блока и одновременно начало следующего.
Math.min(i += portion, text.length()) — позволяет определить конец блока и не выйти за пределы самого текста.