Java ArrayList объединить без дубликатов на основе значения
У меня есть класс под названием Sample
этот класс имеет свойство, которое является ArrayList<Area>
и Area
содержит ArrayList<Elements>
public class Sample {
private ArrayList<Area> sampleAreas;
public ArrayList<Element> getMergedData()
{
...
}
...
}
public class Area {
private ArrayList<Element> areaElements
...
}
public class Element {
private String name;
private Float value;
...
}
Мне нужно, чтобы getMergedData()
от Sample
класс объединяет каждый ArrayList<Elements>
от каждой его области, сохраняя элемент с большей ценностью.
Пример:
Area 1: ("Element K" => 1.0, "Element C" => 0.5, "Element AS" => 15.0)
Area 2: ("Element K" => 10.1, "Element C" => 5.5, "Element AS" => 2.9, "Element O" => 1.5)
Area 3: ("Element C" => 2.8, "Element AS" => 0.5, "Element O" => 5.8)
Area 4: ("Element K" => 3.25, "Element AS" => 2.5, "Element O" => 0.1)
Итак, этот метод должен возвращать что-то вроде этого:("Element K" => 10.1, "Element C" => 5.5, "Element AS" => 15.0, "Element O" => 5.8"
Я не могу понять, как я могу сделать это модным способом.
1 ответ
Если элементы списков имеют одинаковый порядок, например, их K
элемент во-первых, их C
элемент является вторым и т. д., затем просто проведите поэлементное сравнение. В противном случае вы можете отсортировать их по именам их элементов, а затем выполнить поэлементное сравнение (это nlog(n), если вы используете хороший алгоритм сортировки), или же поместить все в HashMap с именем элемента в качестве ключа и ценность как ценность.
HashMap map = new HashMap();
for(int i = 0; i < list1.size(); i++) {
Element e = list1.get(i);
map.put(e.name, e.value);
}
for(int i = 0; i < list2.size(); i++) {
Element e = list2.get(i);
if(map.get(e.name) < e.value)
map.put(e.name, e.value);
}