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);
}
Другие вопросы по тегам