使用集合引用作为if语句条件而不进行比较?

Vic*_*ton 3 java collections if-statement boolean reference

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

代码来自一个班级,导师在我的课程收集教程中进行了开发.该类代表具有相关犯罪代码的地区犯罪表.工作表实现为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);
         } 
    }
}
Run Code Online (Sandbox Code Playgroud)

我运行代码,可以看到这有效,但我无法遵循if条件的逻辑.

我的理解是searchCode.retainAll(crimeTable.get(eachDistrict))将评估对列表searchCode的引用,并且,此时,如果eachDistrict的Map条目具有crimeCode,则searchCode将包含crimeCode参数给出的单个值在它的一组值或否则将为空.

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

有人可以解释一下我缺少的东西吗?

Boh*_*ian 8

这是非常糟糕的代码.但是,这是它的工作原理:

如果列表因操作而更改,则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);
        } 
    }
}
Run Code Online (Sandbox Code Playgroud)

但即便如此,通过使用更少的代码执行得更好,可以改进:

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());
        } 
    }
}
Run Code Online (Sandbox Code Playgroud)

最后一个版本避免了所有的大量调用get().它是编码它的最精英方式.建议你的老师顺便找一份工作.