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

标签 java if-statement collections reference boolean

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

该代码来自导师在我的类(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/

相关文章:

java - 非整数计数包 Map<Object, BigDecimal>

java - 为什么包含值返回 false?

vb.net - List(of String) 或 Array 或 ArrayList

java - 刷新 ArrayList Android 应用程序

linux - Shell 脚本 - 比较 if then else 中的 float

java - 当类从线程扩展时,如何使用 resultreceiver 发送数据

c - If 语句不断循环 - c

python - 对 `python` 中的同一变量使用多个条件

java - 如何在java中的特定字符之后修剪字符串

java - 当Spring管理的bean和Pojo依赖相同的服务时如何避免Singleton