实体列表中值的频率

Frequency of a value in a list of entities

我有一个名为 Elementfisa 的实体,其中包含值 (id,Post,Sarcina)。现在,Post(Int Id,String Nume,String Tip) 和 Sarcina(Int Id,String Desc) 也是实体。我有一个作为 Elementfisa 添加的所有元素的列表,我想在一个单独的列表中获取每个 Elementfisa 包含的每个八叠球菌的频率。这是我现在的代码:

    int nr=0;
    List<Integer> frecv=new ArrayList<Integer>();
    List<Sarcina> sarcini = new ArrayList<>();
    List<Elementfisa> efuri=findEFAll();
    for (Elementfisa i : efuri)
    {
        nr=0;
        for (Sarcina s : sarcini)
            if (s.equals(i.getSarcina()))
                    nr=1;
        if (nr==0)
        {
            int freq = Collections.frequency(efuri, i.getSarcina());
            sarcini.add(i.getSarcina());
            frecv.add(freq);
        }
    }

(findEFAll() returns 来自存储库的 Hashmap 中包含的每个元素) 但出于某种原因,虽然 sarcini 列表包含来自每个 Elementfisa 的所有 Sarcina,但频率列表将在每个位置显示 0。我应该更改什么才能使每个位置都显示正确的出现次数?

您正在 efuriList<Elementfisa> 上使用 Collections.frequency()。但是您将 i.getSarcina() 传递给它,一个 Sarcina 对象。 ElementfisaList 不可能包含 Sarcina 对象,所以你得到零。您可能向该方法传递了错误的列表。


编辑:
要查看 efuri 中的所有 Sarcina,您可以使用 Java 8 个流来执行此操作:

efuri.stream().map(element -> element.getSarcina())
    .collect(Collectors.toList()).contains(i.getSarcina())

细分:

efuri.stream() //Turns this into a stream of Elementfisa
.map(element -> element.getSarcina()) //Turns this into a stream of Sarcina
.collect(Collectors.toList()) //Turn this into a list
.contains(i.getSarcina()) //Check if the list contains the Sarcina

您确定不需要覆盖 Elementisaequals() 吗? (还有 hashcode())。默认的 Java equals() 似乎没有得到你想要的,因为它会检查两个 Elementisa 对象的身份(而不是值),而在你的逻辑中,两个这样的对象与相同的值可以被认为是等价的。

有关 equals() 的更多信息,请参阅

What issues should be considered when overriding equals and hashCode in Java?