实体列表中值的频率
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。我应该更改什么才能使每个位置都显示正确的出现次数?
您正在 efuri
、List<Elementfisa>
上使用 Collections.frequency()
。但是您将 i.getSarcina()
传递给它,一个 Sarcina
对象。 Elementfisa
的 List
不可能包含 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
您确定不需要覆盖 Elementisa
的 equals()
吗? (还有 hashcode()
)。默认的 Java equals()
似乎没有得到你想要的,因为它会检查两个 Elementisa
对象的身份(而不是值),而在你的逻辑中,两个这样的对象与相同的值可以被认为是等价的。
有关 equals()
的更多信息,请参阅
What issues should be considered when overriding equals and hashCode in Java?
我有一个名为 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。我应该更改什么才能使每个位置都显示正确的出现次数?
您正在 efuri
、List<Elementfisa>
上使用 Collections.frequency()
。但是您将 i.getSarcina()
传递给它,一个 Sarcina
对象。 Elementfisa
的 List
不可能包含 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
您确定不需要覆盖 Elementisa
的 equals()
吗? (还有 hashcode()
)。默认的 Java equals()
似乎没有得到你想要的,因为它会检查两个 Elementisa
对象的身份(而不是值),而在你的逻辑中,两个这样的对象与相同的值可以被认为是等价的。
有关 equals()
的更多信息,请参阅
What issues should be considered when overriding equals and hashCode in Java?