java—实体列表中值的频率

esbemjvw  于 2021-07-12  发布在  Java
关注(0)|答案(2)|浏览(542)

我有一个名为elementfisa的实体,它包含as值(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()从存储库返回hashmap中包含的每个元素)但是由于某种原因,sarcini列表包含每个elementfisa中的所有sarchina,而frequency列表在每个位置都显示0。我应该改变什么以便每个位置都显示正确的出现次数?

dkqlctbz

dkqlctbz1#

你用的是 Collections.frequency()efuri ,一个 List<Elementfisa> . 但你路过了 i.getSarcina() 为了它,一个 Sarcina 对象。一 ListElementfisa 不可能包含 Sarcina 所以你得到零。您可能向方法传递了错误的列表。
编辑:
看看所有 Sarcina s在 efuri ,您可以使用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
d6kp6zgx

d6kp6zgx2#

您确定不需要重写吗 equals()Elementisa ? (以及 hashcode() 也是)。默认java equals() 似乎没有得到你想要的,因为这将是检查身份(而不是价值)的两个 Elementisa 对象,而在您的逻辑中,具有相同值的两个这样的对象可能被认为是等价的。
更多关于 equals() ,请参见
在java中重写equals和hashcode时应该考虑哪些问题?

相关问题