Я хотел получить list
уникальных элементов из list
с повторяющимися элементами, и порядок элементов, встречающихся в списке, должен поддерживаться.
Для этого я мог бы написать такой алгоритм:
private ArrayList<T> getUnique(ArrayList<T> list)
{
// maintain a hashmap of numbers and a uniqueList to be returned(ArrayList<T>)
// Add element in result list and the hashmap if the element isn't already present in the hashmap, else just add in the hashmap
HashMap<T, Boolean> map = new HashMap<>();
ArrayList<T> uniqueList = new ArrayList<>();
for (T t: list)
{
if (map.get(t) == null)
{
// t wasn't present so, adding them in map as well as in the list
map.put(t, true);
uniqueList.add(t);
}
}
return uniqueList;
}
Этот алгоритм займет O(n)
времени с O(n)
дополнительным пространством (для HashMap).
Или просто я мог бы использовать следующий синтаксис:
Set<T> set = new LinkedHashSet<>(list);
Приведенный выше синтаксис в Java используется для получения set
уникальных элементов из list
с порядком появления элементов, таким же, как у list
. Затем преобразуйте этот набор в список. (ArrayList<T> uniqueList = new ArrayList<>(set);
)
Я предполагаю, что временная сложность здесь также O(n)
. Я хотел знать, какой алгоритм использует для этого Java.
Я вижу, что класс называется LinkedHashSet, поэтому я подумал, что они могут использовать некоторые концепции LinkedList
для достижения этого. Поэтому я просмотрел исходный код и нашел следующее:
- В
LinkedHashSet.java
конструктор выглядит так:
143: public LinkedHashSet(Collection<? extends T> c)
144: {
145: super(c);
146: }
здесь находится источник.
- Итак, я посмотрел на конструктор родительского класса, т.е.
HashSet
, и нашел:
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
- Затем я искал метод
addAll
, я нашел его в классеAbstractCollection
(который является прародителем классаHashSet
), определение функции:
public boolean addAll(Collection<? extends E> c) {
boolean modified = false;
for (E e : c)
if (add(e))
modified = true;
return modified;
}
Это вызов add
, что-то вроде:
public boolean add(E e) {
throw new UnsupportedOperationException();
}
здесь а>.
Я не мог этого понять. Какой алгоритм они используют для этой задачи?
add
— это полиморфный метод (все методы в Java). Посмотрите здесь stackoverflow.com/questions/ 4605669/ - person algrid   schedule 22.09.2018