gpt4 book ai didi

java - 在没有比较的情况下使用集合引用作为 if 语句条件?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:40:10 24 4
gpt4 key购买 nike

我有点不好意思问这个问题,因为我确定这是一个非常基本的问题,但经过搜索和思考我仍然无法解决这个问题。

该代码来自导师在我的类(class)的集合教程中逐步开发的类(class)。该类表示具有相关犯罪代码的地区犯罪表。该工作表作为 SortedMap 实现,其中键的类型为 String(代表地区),值是 Integers 的 ArrayList(代表犯罪代码)。

在导师发送的教程中,有一个方法我们没能完成,我无法理解其中的逻辑。该方法的代码如下

/**
* displays districts affected by given crime code
*
* @param Integer crime code
* @return none
*/
public void displayAffectedDistricts(Integer crimeCode)
{
ArrayList<Integer> searchCode;
for(String eachDistrict: crimeTable.keySet())
{
searchCode = new ArrayList<Integer>();
searchCode.add(crimeCode);
if(!(searchCode.retainAll(crimeTable.get(eachDistrict))))
{
System.out.println("Code "+crimeCode+" found in district "+eachDistrict);
}
}
}

我已经运行了代码并且可以看到这有效,但我无法遵循 if 条件的逻辑。

我的理解是 searchCode.retainAll(crimeTable.get(eachDistrict)) 将评估对列表 searchCode 的引用,并且在这一点上,如果 Map 条目为eachDistrict 的值集中有 crimeCode,否则为空。

据我所知,这不是 boolean 值,因此不能用作没有比较运算符的 if 条件。

有人可以解释一下我遗漏了什么吗?

最佳答案

这是非常糟糕的代码。但是,它是这样工作的:

retainAll()如果列表因操作而更改,则方法返回 true。创建一个包含目标代码的列表,如果另一个列表包含它,则列表不会改变。

如果我要标记它,我会严厉地标记写这篇文章的人,因为它很迟钝。这是一个更好的实现,使用更少的代码,简单易懂,性能也更好:

public void displayAffectedDistricts(Integer crimeCode) {
for (String eachDistrict : crimeTable.keySet()) {
if (crimeTable.get(eachDistrict).contains(crimeCode)) {
System.out.println("Code "+crimeCode+" found in district "+eachDistrict);
}
}
}

但即使这样也可以通过使用更少的代码来改进并且表现得更好:

public void displayAffectedDistricts(Integer crimeCode) {
for (Map.Entry<String, ArrayList<Integer>> entry : crimeTable.entrySet()) {
if (entry.getValue().contains(crimeCode)) {
System.out.println("Code "+crimeCode+" found in district "+entry.getKey());
}
}
}

最后一个版本避免了对 get() 的所有多次调用。这是最精英的编码方式。把这个建议给你的老师,顺便说一句,他应该找另一份工作。

关于java - 在没有比较的情况下使用集合引用作为 if 语句条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16634524/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com